アプリのセキュリティを向上させ、ユーザーを MITM 攻撃から保護するために、この投稿の内容に従って、自己署名証明書を使用して SSL ピンニングを実行しようとしています。
そのため、次のコードを使用して、サーバーから取得した証明書とアプリにバンドルされている証明書を比較しています。
- (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];
}
}
私のコードと私がリンクしたブログ投稿のコードとの唯一の違いは、私の証明書を表すリソースの名前と拡張子 (.cer から .crt) と、後で表示するのに便利な追加した 2 つの NSLog だけです。問題は何ですか。
実際、このコードを実行すると、次の出力が得られます。
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
データの長さが異なるため、ローカル証明書とリモート証明書の比較は明らかに失敗し、ピニングも失敗します。
この問題が発生する理由と、この問題を解決するにはどうすればよいですか?