我的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
答案 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
}
}
祝你好运!