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

Posted

技术标签:

【中文标题】iOS:我的 iPhone 应用程序可以访问 iPhone 设备/设备信任存储的可信 CA 证书吗?【英文标题】:iOS: Can my iPhone app access trusted CA certificates of the iPhone device / device's trust store? 【发布时间】:2013-11-05 10:29:07 【问题描述】:

我的 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

【问题讨论】:

我能够解决这个问题。我们可以验证自定义 CA 签名的服务器证书,前提是自定义 CA 证书应受信任并安装到设备密钥链中(通过电子邮件或 Safari) @bms 你解决了这个问题吗? @Karthik,是的。我已将我自己的 CA 证书安装到设备密钥链中,并使用 SecTrustEvaluate API 进行验证。 【参考方案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
            
        

祝你好运!

【讨论】:

感谢您的回复。我已在我的问题中添加了详细信息。请看一看。 谢谢你。这是针对自定义 CA 证书进行服务器验证的方法之一。但是,我不想将我的 CA/根证书捆绑为我的应用程序的一部分。在企业场景中,我的应用用户可以拥有自己的 CA 证书,该证书未由任何已知的公共 CA 机构签名。在这种情况下,捆绑 CA 将无助于服务器认证验证。如果我的应用程序用户有自己的 CA,那么他们应该能够使用 Safari/email 将该 CA 证书安装到设备中。我的应用应根据此自定义 CA 证书验证服务器证书。

以上是关于iOS:我的 iPhone 应用程序可以访问 iPhone 设备/设备信任存储的可信 CA 证书吗?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone SDK:可以通过iPad设备访问Localhost吗? (调试时)

在我的 iPhone 文件夹中,如何为我的应用创建文件夹? [iOS 13]

iOS通过wifi上传文件到应用程序

如何在 Swift iOS 中获取路由器的 IP 地址

从 iPhone 访问 localhost(在同一网络中)

XAMPP:无法从智能手机(iPhone)加载访问 url 的资源