1

他のサーバー (Gmail など) との SSL POP 接続を確立するために、OpenSSL ライブラリを使用してプログラムを作成しています。このために、OpenSSL を使用して自己署名証明書を生成し、検証しました。

./openssl verify -CAfile /home/melluru/openssl/ssl/certs/cert.pem
           /home/melluru/openssl/ssl/certs/cert.pem
>/home/melluru/openssl/ssl/certs/cert.pem: OK

OpenSSL ツールの検証オプションで「OK」の結果が得られます。しかし、プログラムで以下を使用して証明書をロードし、結果を確認すると、エラーが発生します

/** to add the cert file**/  
if(!(SSL_CTX_use_certificate_file(ctx,"/home/melluru/openssl/ssl/certs/cert.pem",
                             SSL_FILETYPE_PEM)))
    printf("Cant read certificate file\n");
/** to add the private key ***/
if(!(SSL_CTX_use_PrivateKey_file(ctx,"/home/melluru/openssl/ssl/certs/cert.pem",
                           SSL_FILETYPE_PEM)))
    printf("Cant read keyfile\n");
/** to cadd the trusted cert **/   
if(SSL_CTX_load_verify_locations(ctx,"/home/melluru/openssl/ssl/certs/cert.pem",
                             NULL) != 1) {
    printf("loading trust certificate failed\n");
    SSL_CTX_free(ctx);
    return 0;
}

/*** BIO code to connect to gmail server *****/

printf("ssl verify error is %d\n",SSL_get_verify_result(ssl));

エラー 20 が表示されますX509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY
誰でも助けることができますか?まだ追加する必要があるものはありますか?

4

1 に答える 1

2

openssl verify証明書は自己署名されているため、コマンド ラインを使用した場合と同様に、証明書を使用して署名を確認できます。

ただし、SSL 接続を確立しようとする場合、確認したいのは自分の証明書ではなく、サーバー (またはクライアント) から受け取った証明書です。

この行SSL_CTX_load_verify_locationsでは、信頼する証明書チェーンを指定する必要があります。ハンドシェイク プロトコルを介して受け取った証明書に対してチェックされるのは、このチェーンです。

あなたが説明しているような環境で作業したことはありませんが、gmail に接続したいと言っているので、gmail の証明書チェーンである必要があります。SSL_CTX_load_verify_locations

そのため、「X509_V_ERR_UNABLE_TO_GET_ISSUER_CERT_LOCALLY」というエラーが表示されます。SSL_CTX_load_verify_locationsOpenSSL は、受信している証明書の発行者証明書をローカルで (メソッドを介して配置したチェーンで) 見つけることができませんでした。

于 2012-10-08T13:46:38.427 に答える