在我的iOS应用中,我正在尝试连接到具有不受信任证书的服务器。
我正按照此网址中指定的程序处理此情况:
这很好。
现在我有一个要求,我需要在其中显示与证书相关的详细信息,例如:
现在我几乎没有问题:
Q1。我如何获得以上入伍信息?有没有提供相同的cocoa API?
Q2。通常在Web浏览器中,它显示与该证书相关的所有详细信息。我们是否需要在iOS应用中遵循相同的行为?
请建议。
答案 0 :(得分:1)
Q1:https://stackoverflow.com/a/8903088/2957168应该完全回答你的问题。如果您需要其他说明,请发表评论。
第二季度:那是您的决定 - 如果您的服务器运行自己的证书并且您希望以这种方式保留(如企业应用程序那样),只需验证证书SHA1或MD5是您的“#”;期待(这就是我们在应用程序中的表现)。这意味着你需要一个实现NSURLConnectionDelegate
或NSURLConnectionDataDelegate
的类(如果你想要数据的处理程序)
然后实现这些方法:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace
{
NSLOG(@"connection canAuthaenticateAgainstProtectionSpace");
if (![Certificates verifyProtectionSpace:protectionSpace]) { //this to verify your own certificate which is self signed.
NSLOG(@"Bad Certificate, canceling request");
[connection cancel];
self.ended = true;
return false;
}
return true;
}
- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLOG(@"connection didReceiveAuthenticationChallenge");
if ([Certificates verifyProtectionSpace:challenge.protectionSpace]) { //this is where you verify the certificates again - for non self-signed ones usually.
[challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
} else {
[challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge];
}
}
答案 1 :(得分:0)
要回答您的问题,似乎没有Cocoa API来解决此问题,但是,如果您参考以下信息:
信任对象和NSURLConnection https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/OverridingSSLChainValidationCorrectly.html#//apple_ref/doc/uid/TP40012544-SW6
您将看到如何覆盖我假设您正在使用的NSURLConnection的链验证行为。在提供的代码中,您可以获得对SecTrustRef的引用,可以使用安全框架中的SecTrustGetCertificateCount进一步查询。在迭代证书时,可以使用SecCertificateCopyValues(https://developer.apple.com/library/mac/documentation/security/Reference/certifkeytrustservices/Reference/reference.html)查询它们,并使用OID密钥在返回的字典中提取任何信息。