0

tlsでサーバーに接続するためにopensslを使用してコードを記述しました。pemファイルから証明書をロードすると、正しく機能します。しかし、pfxファイルから証明書をロードすると、SSL_connectの呼び出し中にSSL_ERROR_SSLが発生します。pfxファイルをロードするプロセスが間違っているかどうかはわかりません。プロセスは以下のとおりです。

FILE* fp = fopen("cert.pfx", "rb");
PKCS12* p12 = d2i_PKCS12_fp(fp, NULL);
PKCS12_parse(p12, NULL, &private_key, &certificate, &ca_certificates);
SSL_CTX_use_certificate(ctx, certificate);
SSL_CTX_use_PrivateKey(ctx, private_key);
SSL_CTX_check_private_key(ctx);
SSL_CTX_add_extra_chain_cert(ctx, sk_X509_value(ca_certificates, i);
SSL_CTX_add_client_CA(ctx, sk_X509_value(ca_certificates, i);
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, NULL);
SSL_CTX_set_mode(ctx, SSL_MODE_AUTO_RETRY);
...
SSL* ssl = SSL_new(ssl_context);
SSL_set_fd(ssl, sockfd);
SSL_connect(ssl);
...

他のクライアントでpfxファイルをテストしました。それはうまくいきます。したがって、問題はpfxファイルではありません。opensslが接続に失敗するオプションはありますか?または、CA証明書を正しく設定していませんか?pfxファイルには、自分で署名したCAが含まれています。ただし、他のクライアントでは機能します。

SSL_connect()が失敗した後、ERR_get_error()を呼び出しました。そして、証明書の検証に失敗しました。したがって、上記のpfxファイルのロードプロセスに問題があると思います。たぶん私はCA証明書を正しく追加していません。誰かがpfxをロードするための正しいプロセスを教えてもらえますか?

助けてください!

4

2 に答える 2

1

SSL_CTX_add_extra_chain_certを使用して証明書を追加する順序が重要であることを発見しました。PKCS12_parseによって証明書が追加される順序は、libssl0.9.8からlibssl1.0に変更されている必要があります。そのため、以下のコードを使用して証明書ストアに追加するように切り替えました。

X509_STORE * certStore = SSL_CTX_get_cert_store(ctx);
for(int i = 0; i < sk_X509_num(ca) ; i++)
{
    if (X509_STORE_add_cert(certStore, sk_X509_value(ca_certificates, i))==0)
    {
        ERR_print_errors_fp (stderr);
    }
}
于 2012-12-21T11:41:00.137 に答える
0

あなたのi変数はサイズのカウンターsk_num(ca_certificates)ですか?SSL_CTX_add_client_CAそうである場合は、クライアントに適さないと思われる行を削除してみてください(わからない、難しい)。

また、エラー処理では、次の行を入力して理由を確認してください。

SSL_load_error_strings(); // just once
char msg[1024];
ERR_error_string_n(ERR_get_error(), err_msg, sizeof(err_msg));
printf("%s\n", msg);`

または、SSLエラーを直接取得してみることもできます。

int ssl_error = SSL_get_verify_result(ssl);

結果のintは、このページで確認できます

于 2012-09-06T14:01:49.827 に答える