在iOS应用中显示不受信任的证书信息

时间:2013-11-17 02:40:26

标签: cocoa-touch ios6 ios7 nsurlconnection digital-certificate

在我的iOS应用中,我正在尝试连接到具有不受信任证书的服务器。

我正按照此网址中指定的程序处理此情况:

https://developer.apple.com/library/mac/documentation/cocoa/conceptual/urlloadingsystem/Articles/AuthenticationChallenges.html

这很好。

现在我有一个要求,我需要在其中显示与证书相关的详细信息,例如:

  1. 名称
  2. 位置
  3. 组织单位
  4. 电子邮件地址
  5. 日期前无效
  6. 日期后无效
  7. 签名算法
  8. 现在我几乎没有问题:

    Q1。我如何获得以上入伍信息?有没有提供相同的cocoa API?

    Q2。通常在Web浏览器中,它显示与该证书相关的所有详细信息。我们是否需要在iOS应用中遵循相同的行为?

    请建议。

2 个答案:

答案 0 :(得分:1)

Q1:https://stackoverflow.com/a/8903088/2957168应该完全回答你的问题。如果您需要其他说明,请发表评论。

第二季度:那是您的决定 - 如果您的服务器运行自己的证书并且您希望以这种方式保留(如企业应用程序那样),只需验证证书SHA1或MD5是您的“#”;期待(这就是我们在应用程序中的表现)。

这意味着你需要一个实现NSURLConnectionDelegateNSURLConnectionDataDelegate的类(如果你想要数据的处理程序)

然后实现这些方法:

- (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密钥在返回的字典中提取任何信息。