2009-08-09 21 views
6

現在NSURLConnectionを使用してWebサーバーへのhttps接続を開いています。すべてが正常に動作し、私は後のページコンテンツを取得することができます。証明書はVeriSignによって発行されていますが、NSURLConnectionは証明書の信頼性をある程度検証するためにいくつかの作業を行っています。モバイルサファリを使用して同じウェブサイトに接続した場合、証明書から抽出し、ナビゲーションバーに組織(ウェブサイトの)を表示します。 Cocoa Touchでこれらの詳細を抽出することは可能でしょうか?私はユーザーにそれらを提示したいのですか?また、その証明書に対するサーバーのホスト名が合理的であることを検証して、ウェブサイトが合法であると見なすことができるでしょうか?Cocoa Touchでウェブサイト証明書を確認する方法は?

答えて

5

NSURLConnectionは、無効な証明書を持つサーバーに接続しようとするとエラー(NSURLErrorDomain)を返します(自己署名、期限切れ、間違ったホストなど)。したがって、実際に検証する必要はありません。なぜなら、それはすべてあなたのために処理されるからです。

UIにSSL証明書の概要を表示したい場合は、レイヤーをNSURLConnectionから削除し、代わりに低レベルのCFNetwork APIを使用する必要があります。あなたは(あなたのストリームハンドルがreadStreamと呼ばれていると仮定して)次のことを行うことができるはずkCFStreamEventEndEncountered状態でだCFReadStreamRefを、持っていたら:

NSArray* certificates = [(NSArray*)CFReadStreamCopyProperty(readStream, kCFStreamPropertySSLPeerCertificates) autorelease]; 
if ([certificates count] > 0) { 
    SecCertificateRef certificate = (SecCertificateRef)[certificates objectAtIndex:0]; 
    NSString* description = [(NSString*)SecCertificateCopySubjectSummary(certificate) autorelease]; 
    NSData* data = [(NSData*)SecCertificateCopyData(certificate) autorelease]; 
} 

したい場合は、dataで開催された情報をデコードする必要があります証明書のさまざまなプロパティにアクセスできますが、descriptionに保存されている要約で十分です。

+1

助けてくれてありがとうNathan、あなたが提案したようなレイヤーを落とすことはそのトリックをやった!実際問題ではありませんが、あなたのNSDictionary *キャストは代わりにNSArray *であるべきですか? – dbotha

+0

コードサンプルDeonを投稿できますか? – Pripyat

+0

@Deonそうですよ!私はサンプルコードを更新しました。 –

関連する問題