私のアプリのセキュリティを向上させ、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
明らかにローカルとリモートの証明書との比較は失敗します。
なぜこの問題が発生し、この問題を解決するにはどうすればよいですか?
返された証明書データをファイルに保存して使用するだけでいいですか?それ以外の場合は、データをdiffして何が違うかを確認してください。 –
いいえ、私はそれを考えなかった!良いアイデア、すぐにお試しください! – BigLex
Alamofireを使用している場合は、http://jayprakashdubey.blogspot.in/2017/07/ssl-pinning-in-ios-swift-code.htmlを確認してください。 –