0

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

谢谢,bms

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

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

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

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

谢谢,bms

4

1 回答 1

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
            }
        }

祝你好运!

于 2013-11-05T10:34:19.493 回答