我为这个冗长的问题提前道歉。我在使用自签名SSL证书时遇到问题,我想记录到目前为止我尝试过的所有内容。
我正在开发一个与REST服务通信的应用程序。测试服务器使用自签名的ssl证书,我可以在我的计算机上安装该证书。这是一个需要密码才能安装的.p12文件。如果未安装此证书,则对服务器的所有请求都将返回403。
.p12在Keychain中安装了三个项目,一个“根证书颁发机构”,一个由“根证书颁发机构”颁发的“测试用户”证书,以及一个与“测试用户”证书相关联的私钥。
我已经通过给自己发送.p12文件在iPad上安装了此证书。我点击附件,输入密码,现在我可以访问Safari中的网站了。不幸的是,由于应用程序沙盒,这还不足以使我的应用程序与REST服务进行通信。
我正在使用ASIHTTPRequest来完成与我的应用程序中的REST服务的所有通信。每个请求都是ASIHTTPRequest的子类。我发现我要做的第一件事就是调用[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。
我承认我真的不知道我在这里做什么。这一切都有点过头了,任何人都可以给予我的帮助将非常感激。
答案 0 :(得分:29)
好的,我明白了。我有点吠叫错误的树。
我发现的最重要的信息是Apple的Certificate, Key, and Trust Services Programming Guide文档,特别是“iOS的任务”页面。其中详细介绍了如何从.p12文件中提取安全标识以及如何添加信任异常。
最后一个难题是在Client Certificate Support的ASIHTTPRequest文档中。通过使用我直接从p12文件中提取的标识,我能够将其传递给请求并正确地验证所有内容。
我希望这可以帮助其他任何必须实现类似功能的人。