2

現在、エンドツーエンドの暗号化を使用して 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;
}
4

1 に答える 1

1

コードは、キーチェーンに存在するアンカー (信頼されたルート) 証明書に対して clientCert を評価します。caCert に対して評価する場合は、caCert をアンカー証明書として SecTrustSetAnchorCertificates に登録する必要があります。

または、caCert を certArray に追加することもできます。

SecCertificateRef certArray[2] = { clientCert, caCert };
CFArrayRef myCerts = CFArrayCreate(
                               NULL, (void *)certArray,
                               2, NULL);


SecTrustRef myTrust;
OSStatus status = SecTrustCreateWithCertificates(
                                             myCerts,
                                             myPolicy,
                                             &myTrust);

チェックアウト: https://developer.apple.com/library/ios/documentation/security/conceptual/CertKeyTrustProgGuide/iPhone_Tasks/iPhone_Tasks.html#//apple_ref/doc/uid/TP40001358-CH208-SW13

4. ... 中間証明書または証明書チェーンのアンカー証明書がある場合は、それらを SecTrustCreateWithCertificates 関数に渡される証明書配列に含めることができます。そうすることで、信頼評価が高速化されます。

于 2014-07-08T00:40:02.590 に答える