在iPhone应用中使用自签名SSL证书

34

我很抱歉这个问题有点冗长。我遇到了自签名SSL证书的问题,想记录下我已经尝试过的一切。

我正在开发一个与REST服务通信的应用程序。测试服务器使用一个我可以在电脑上安装的自签名ssl证书。这是一个.p12文件,需要输入密码进行安装。如果没有安装此证书,所有对服务器的请求都将返回403错误。

.p12文件在钥匙串中安装了三个项目,一个 "根证书授权",一个由 "根证书授权" 发布的 "测试用户" 证书和与 "测试用户" 证书相关联的私钥。

我通过将.p12文件发送电子邮件的方式将该证书安装在我的iPad上。我点击附件,输入密码,现在可以在Safari中访问该网站。不幸的是,由于应用程序沙盒的限制,这还不足以使我的应用程序与REST服务通信。

我在我的应用程序中使用ASIHTTPRequest来完成与REST服务的所有通信。每个请求都是ASIHHTPRequest的子类。我发现必须调用 [self setValidatesSecureCertificate:NO]; 才能尝试与服务器建立SSL连接。如果只是这样做,我会从服务端收到403错误代码。

现在我似乎无法弄清楚如何使请求使用证书。我已经尝试将这三个项目分别导出为.cer文件,并将它们包含在项目中,然后使用下面的代码将它们添加到请求中:

NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cert" ofType:@"cer"]];
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)data);
...
[self setClientCertificates:[NSArray arrayWithObjects:(id)cert, ..., nil]];

虽然使用这种方法代码能够正常执行,但我仍然遇到了403错误。

我甚至尝试将.p12文件包含在我的应用程序中,并使用相同的代码导入它。 但是这会失败,因为SecCertificateCreateWithData返回了nil。

我承认我不太清楚自己在做什么。 这有点超出了我的能力范围,如果有人能给我任何帮助,我将不胜感激。

1个回答

29

好的,我弄明白了。我之前有些方向错误了。

我发现最重要的信息在 Apple 的 Certificate, Key, and Trust Services Programming Guide 文档中,特别是 "Tasks for iOS" 页面上。那里详细介绍了如何从 .p12 文件中提取安全身份以及如何添加信任例外。

谜题的最后一块拼图在 ASIHTTPRequest 的文档 Client Certificate Support 上找到。通过直接使用我从 p12 文件中提取的身份,我能够将其传递给请求并正确地进行身份验证。

我希望这对需要实现类似功能的其他人有所帮助。


链接已经失效了,我猜应该是这个链接:https://developer.apple.com/library/content/documentation/Security/Conceptual/CertKeyTrustProgGuide/index.html - Oriol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接