2013-05-22 16 views
6

私のアプリのセキュリティを向上させ、MITM攻撃からユーザーを保護するために、私は自己署名入りの証明書でthis postの内容に従ってSSLピンインをしようとしています。iOSでのSSLピンニング

私は次のコードを使って、サーバーから取得した証明書とアプリケーションにバンドルされている証明書を比較します。私はリンク私のコードやブログの記事内の1つの間で異なる

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; 
    SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, 0); 
    NSData *remoteCertificateData = CFBridgingRelease(SecCertificateCopyData(certificate)); 
    NSLog(@"Remote Certificate Data Length: %d",[remoteCertificateData length]); 
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"apache" ofType:@"crt"]; 
    NSData *localCertData = [NSData dataWithContentsOfFile:cerPath]; 
    NSLog(@"Local Certificate Data Length: %d",[localCertData length]); 
    if ([remoteCertificateData isEqualToData:localCertData]) { 
     NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust]; 
     [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; 
    } 
    else { 
     [[challenge sender] cancelAuthenticationChallenge:challenge]; 
    } 
} 

唯一のものは、私の証明書と私が追加した2つのNSLogsを表すリソースの名前と拡張子(.CRTする.CER)です問題が何であるかを示すために後で便利になるでしょう。このコードが実行されたときに実際に

私はこの出力を得る:データの長さが異なっているので、それはまた、ピニングを失敗したので

2013-05-22 16:08:53.331 HTTPS Test[5379:c07] Remote Certificate Data Length: 880 
2013-05-22 16:09:01.346 HTTPS Test[5379:c07] Local Certificate Data Length: 1249 

明らかにローカルとリモートの証明書との比較は失敗します。

なぜこの問題が発生し、この問題を解決するにはどうすればよいですか?

+1

返された証明書データをファイルに保存して使用するだけでいいですか?それ以外の場合は、データをdiffして何が違うかを確認してください。 –

+0

いいえ、私はそれを考えなかった!良いアイデア、すぐにお試しください! – BigLex

+0

Alamofireを使用している場合は、http://jayprakashdubey.blogspot.in/2017/07/ssl-pinning-in-ios-swift-code.htmlを確認してください。 –

答えて

5

私は同じ問題がありました。 .crtファイルを正しい形式に変換していない可能性があります。 iOS & OSXは、あなたの証明書が.der形式になるように探しています。あなたはそれを変換するためにopensslを使用する必要があります。 Hereはこのトピックに関する非常に参考になる記事です。私の公開証明書は、Apacheサーバーから来たものです(私もあなたも同様でした)。 opensslのドキュメントを調べた後、私はこれをどのように動作させるかを理解することができました。

1)ターミナルを開き、ディレクトリを.crtの場所に変更します。

2)このコマンドを実行します。

openssl x509 -in your_cert.crt -outform der -out your_output_name.der 

これは 'your_output_file.der' という名前の出力ファイルを作成します。あなたはXcodeプロジェクトにこれをインポートしてNSURLConnectionDelegate実装の

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 

方法でそれを参照する必要があります。

こちらがお役に立てば幸いです。

関連する問題