我需要连接到需要将证书附加到请求的安全 API。我已经在我的设备(它的钥匙串)上安装了所需的证书,但我在尝试让它工作时遇到了很多麻烦。理想情况下,我想用ASIHTTPRequest
它来完成这个,因为它有方便的setClientCertificateIdentity:
方法。但是,我无法将安装的证书转换为所需的文件格式(SecIdentityRef)。
我尝试了 Apple 文档中的代码从钥匙串中提取证书,这似乎不起作用(只是陷入错误)。我什至尝试过,只是为了它,将证书嵌入到应用程序本身中,至少看看我是否可以让它工作,但没有骰子。根据我正在阅读的所有堆栈溢出线程,我将其转换为NSData
,但是当我尝试使用各种方法SecIdentityRef
从数据中提取时,它总是失败。
我也尝试过不ASIHTTPRequest
使用 , 只是为了利用该didReceiveAuthenticationChallenge
方法,但我在那里也遇到了障碍。话虽如此,我确实成功地让代码通过以下代码找到了我想要的证书:
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
SecTrustRef trustRef = [[challenge protectionSpace] serverTrust];
SecTrustEvaluate(trustRef, NULL);
CFIndex count = SecTrustGetCertificateCount(trustRef);
for (CFIndex i = 0; i < count; i++)
{
SecCertificateRef certRef = SecTrustGetCertificateAtIndex(trustRef, i);
CFStringRef certSummary = SecCertificateCopySubjectSummary(certRef);
CFDataRef certData = SecCertificateCopyData(certRef);
NSLog(@"certSummary: %@", certSummary);
}
这确实打印了我需要的证书。但在那之后,我猜是把它发回服务器的问题,这似乎不适用于我手头的代码。我仍然没有得到任何回应,也没有返回数据。
因此,总而言之,理想情况下,我希望使用ASIHTTPRequest
(尽管我知道它不再受支持),并且我需要SecIdentityRef
格式的证书才能附加到发送请求。看起来很简单,我知道。现在我担心这是否可能?
真的很感激任何明确的方向。提前致谢!
-文森特