我目前正在开发具有端到端加密功能的iOS应用。为了让用户相互进行身份验证,每个用户都会生成一个x509证书签名请求(CSR),并将CSR发送到我们的CA服务器进行签名。
用户可以通过验证其他用户证书是否由CA签名来信任其他用户。
我的问题是:
在iPhone上,我目前拥有需要验证的CA证书和用户证书。 如何验证用户证书是否实际由CA签名?
我最好的尝试是后面的代码,但它没有指定评估clientCert的内容,这让我感到困惑。
-(BOOL) evaluateTrust:(SecCertificateRef) clientCert{
SecPolicyRef myPolicy = SecPolicyCreateBasicX509();
SecCertificateRef certArray[1] = { clientCert };
CFArrayRef myCerts = CFArrayCreate(
NULL, (void *)certArray,
1, NULL);
SecTrustRef myTrust;
OSStatus status = SecTrustCreateWithCertificates(
myCerts,
myPolicy,
&myTrust);
SecTrustResultType trustResult;
if (status == noErr) {
status = SecTrustEvaluate(myTrust, &trustResult);
}
NSLog(@"trustresult %d", trustResult);
return trustResult == kSecTrustResultProceed || trustResult == kSecTrustResultUnspecified;
}
答案 0 :(得分:1)
您的代码根据钥匙串中存在的锚(受信任的根)证书评估您的clientCert。如果您想根据caCert对其进行评估,则需要使用SecTrustSetAnchorCertificates将您的caCert注册为锚证书。
或者,您可以将caCert添加到certArray:
SecCertificateRef certArray[2] = { clientCert, caCert };
CFArrayRef myCerts = CFArrayCreate(
NULL, (void *)certArray,
2, NULL);
SecTrustRef myTrust;
OSStatus status = SecTrustCreateWithCertificates(
myCerts,
myPolicy,
&myTrust);
它说: 4. ...如果您拥有证书链的中间证书或锚证书,则可以将这些证书包含在传递给SecTrustCreateWithCertificates函数的证书数组中。这样做可以加速信任评估。