2011-05-11 88 views
34

对于冗长的问题,我提前表示歉意。我在自签名的SSL证书上遇到了问题,我想记录迄今为止我尝试过的所有内容。在iPhone应用程序中使用自签名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而失败。

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

回答

29

好的,我想通了。我有点吠叫错了树。

我发现的最重要的信息是苹果的文档Certificate, Key, and Trust Services Programming Guide,特别是“iOS的任务”页面。这详细介绍了如何从.p12文件中提取安全标识以及如何添加信任例外。

拼图的最后一部分是在ASIHTTPRequest的文档Client Certificate Support。通过使用我直接从p12文件中提取的身份,我可以将它传递给请求并正确地验证一切。

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

+0

链接被破坏,我想它应该是这个:https://developer.apple.com/library/content/documentation/Security/Conceptual/CertKeyTrustProgGuide/index.html – Oriol 2017-09-07 14:52:28

相关问题