iOS:我的iPhone应用程序可以访问iPhone设备/设备信任存储的可信CA证书吗?

时间:2013-11-05 10:29:08

标签: ios iphone ssl

我的iPhone应用程序想要访问iphone的CA Trust存储来验证服务器证书以进行TLS连接。是否可以访问存储了所有已知可信CA证书的设备密钥链/信任存储?

谢谢, BMS

=================================

感谢您的回复。让我详细介绍一下我的设置。我已经使用openssl创建了一个服务器证书,我已经在我的tomcat服务器上安装了https连接。此外,我使用自己的CA签署了此服务器证书,并通过Safari(http url)将此CA / Root证书安装到我的iPhone中。现在,在我的应用程序中,我想验证服务器证书(由tomcat提供)与安装在iPhone设备配置文件中的CA证书。

这种服务器验证在iOS中是否可行(以编程方式)?

如果服务器证书由公共CA签名,则secTrustEvaluate返回成功的返回码。但是,对于自定义CA签名证书,它返回“kSecTrustResultRecoverableTrustFailure”。

谢谢, BMS

1 个答案:

答案 0 :(得分:1)

你的问题不够具体。有一个非常有用的示例来访问存储证书的钥匙串:

https://github.com/kuapay/iOS-Certificate--Key--and-Trust-Sample-Project

我认为您必须使用以下功能添加证书(使用cer格式):

SecCertificateRef certificate =  SecCertificateCreateWithData(NULL, (CFDataRef) certificateData);

如果它是成功的,您可以将其设置为您的网络模块的根证书...

如果您想评估它:

        CFArrayRef rootCerts = (CFArrayRef)[client.additionalRootCertificates allObjects];
        SecTrustResultType result;
        OSStatus returnCode;

        if (rootCerts && CFArrayGetCount(rootCerts)) {
            // this could fail, but the trust evaluation will proceed (it's likely to fail, of course)
            SecTrustSetAnchorCertificates(trust, rootCerts);
        }

        returnCode = SecTrustEvaluate(trust, &result);

        if (returnCode == errSecSuccess) {
            proceed = (result == kSecTrustResultProceed || result == kSecTrustResultConfirm || result == kSecTrustResultUnspecified);
            if (result == kSecTrustResultRecoverableTrustFailure) {
                // TODO: should try to recover here
                // call SecTrustGetCssmResult() for more information about the failure
            }
        }
祝你好运!