我很抱歉这个问题有点冗长。我遇到了自签名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。
我承认我不太清楚自己在做什么。 这有点超出了我的能力范围,如果有人能给我任何帮助,我将不胜感激。