2012-06-14 41 views
2

我需要连接到安全的API,该API需要将证书附加到请求。我已在我的设备(其钥匙串)上安装了所需的证书,并且在试图使其运行时遇到了一个麻烦。理想情况下,我希望使用ASIHTTPRequest来完成此操作,因为它具有方便的setClientCertificateIdentity:方法。但是,我无法将安装的证书转换为所需的文件格式(SecIdentityRef)。iOS - 将安装的证书从钥匙串连接到请求

我已经尝试过从苹果文档中提取证书的钥匙串中的证书,这似乎并不工作(只是陷入错误)。我甚至尝试过,只是为了做到这一点,将证书嵌入到应用程序本身中,至少可以看到我是否能够工作,但没有骰子。我将它转换为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的Cert以附加发送请求。我知道似乎很简单。现在我担心这是否可能?

真的很感激任何明确的方向。提前致谢!

-Vincent

回答

0

要回答我的问题,或至少提供更多的信息 - 事实证明这是不可能的,至少它的一部分。 iOS请求要求您通过身份验证方法“didReceiveAuthenticationChallenge”来发送证书,但是如果您有一个需要将证书附加到请求的API,则绝对没有办法事先从钥匙串中获取证书。至少从我收集的东西来看。

完成它的唯一方法是先取得实际的证书,而不是从钥匙扣中取出。这可以通过将其嵌入到应用程序中或可能从源下载来完成。从那里,证书可以格式化为附加到请求。不过,即使将该证书嵌入到应用程序中,我仍然还没有完成这部分工作。从NSData到SecIdentityRef的转换依然让我失去了意识,似乎没有任何代码可以用于转换。任何援助,将不胜感激!

+0

原来苹果文档中的代码工作正常。 “extractIdentityAndTrust”方法是我使用的方法。我的问题是我使用的是.cer文件中的NSData,我需要从.pfx文件中使用它。 https://developer.apple.com/library/mac/#documentation/security/conceptual/CertKeyTrustProgGuide/iPhone_Tasks/iPhone_Tasks.html – svguerin3