在iOS上进行SSL固定

Big*_*Lex 6 security ssl foundation ios

为了提高我的应用程序的安全性并保护用户免受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];
    }
}
Run Code Online (Sandbox Code Playgroud)

我的代码和我链接的博客文章中唯一不同的是代表我的证书的资源的名称和扩展名(.cer到.crt)以及我添加的两个NSLogs,稍后会显示它们问题是什么

实际上,当执行此代码时,我得到此输出:

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
Run Code Online (Sandbox Code Playgroud)

显然,本地和远程证书之间的比较失败,因为数据的长度不同,因此它也无法固定.

为什么会发生这种情况,我该如何解决这个问题呢?

i20*_*97i 5

我遇到过同样的问题.问题可能是因为您尚未将.crt文件转换为正确的格式.iOS和OSX正在寻找您的证书格式为.der格式.您需要使用openssl进行转换.是一篇关于这个主题的非常有用的文章.我的公共证书来自Apache服务器(我假设你的服务器也是如此).在查看openssl文档后,我能够弄清楚如何使其工作.

1)打开终端并将目录更改为.crt的位置.

2)执行以下命令:

openssl x509 -in your_cert.crt -outform der -out your_output_name.der
Run Code Online (Sandbox Code Playgroud)

这将创建一个名为"your_output_file.der"的输出文件.您必须将其导入xCode项目并在其中引用它

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
Run Code Online (Sandbox Code Playgroud)

你的NSURLConnectionDelegate实施方法.

我希望这有帮助!