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吗? (调试时)