2

我需要连接到需要将证书附加到请求的安全 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格式的证书才能附加到发送请求。看起来很简单,我知道。现在我担心这是否可能?

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

-文森特

4

1 回答 1

0

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

完成它的唯一方法是预先访问实际的证书,而不是仅仅从钥匙串中提取它。这可以通过将其嵌入应用程序或可能从源下载来完成。从那里,可以格式化证书以附加到请求中。但是,即使将证书嵌入到应用程序中,我仍然没有让这件作品正常工作。从 NSData 到 SecIdentityRef 的转换仍然让我迷失了方向,而且似乎没有代码可以进行这种转换。对此的任何帮助将不胜感激!

于 2012-06-15T14:36:53.887 回答