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

我为这个冗长的问题提前道歉。 我在自签名的SSL证书上遇到了麻烦,我想logging迄今为止我尝试过的所有内容。

我正在开发一个与REST服务进行通信的应用程序。 testing服务器使用一个自签名的SSL证书,我可以在我的电脑上安装而不会出现问题。 这是一个需要安装密码的.p12文件。 没有安装这个证书,所有到服务器的请求返回一个403。

.p12将三个项目安装在“根证书颁发机构”,“根证书颁发机构”颁发的“testing用户”证书以及与“testing用户”证书关联的私钥中。

我通过给自己发送.p12文件在我的iPad上安装了这个证书。 我点击附件,input密码,现在我可以访问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而失败。

我承认我真的不知道我在这里做什么。 这一切都在我的头上,任何人都可以给我的帮助将不胜感激。

好的,我明白了。 我有点吠叫错了树。

我发现的最重要的信息是在Apple的“ 证书,密钥和信任服务编程指南”文档中,特别是“iOS的任务”页面。 这详细介绍了如何从.p12文件中提取安全标识以及如何添加信任exception。

最后一块难题是ASIHTTPRequest关于客户证书支持的文档。 通过使用我直接从p12文件中提取的身份,我能够将其传递给请求,并正确地获得所有的身份validation。

我希望这可以帮助其他人实现类似的function。