web-dev-qa-db-ja.com

「SSLError:[SSL] PEM lib(_ssl.c:2532)」とは、Python sslライブラリを使用することを意味しますか?

Python 3 asyncioモジュールを使用して別のパーティに接続して、このエラーを取得しようとしています:

     36     sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
---> 37     sslcontext.load_cert_chain(cert, keyfile=ca_cert)
     38

SSLError: [SSL] PEM lib (_ssl.c:2532)

問題は、エラーの意味です。私の証明書は正しい、キーファイル(CA証明書)は正しくない可能性があります

26
sargas

バージョン3.4が使用されていると仮定すると:

参照: https://github.com/python/cpython/blob/3.4/Modules/_ssl.c#L2529-L2535

 PySSL_BEGIN_ALLOW_THREADS_S(pw_info.thread_state);
 r = SSL_CTX_check_private_key(self->ctx);
 PySSL_END_ALLOW_THREADS_S(pw_info.thread_state);
 if (r != 1) { 
    _setSSLError(NULL, 0, __FILE__, __LINE__);
    goto error;
 }

それが言っていることは、SSL_CTX_check_private_key失敗;したがって、秘密鍵は正しくありません。

25
jmunsch

コードでは、次を呼び出しています:

_sslcontext.load_cert_chain(cert, keyfile=ca_cert)
_

ドキュメント から:

秘密鍵と対応する証明書をロードします。 certfile文字列は、証明書と証明書の信頼性を確立するために必要な任意の数のCA証明書を含むPEM形式の単一ファイルへのパスでなければなりません。キーファイル文字列は、存在する場合、プライベートキーを含むファイルを指す必要があります。そうでない場合、プライベートキーもcertfileから取得されます。証明書がcertfileに保存される方法の詳細については、証明書の説明を参照してください。

例の引数の名前に基づいて、CA証明書をkeyfile引数に渡しているようです。それは誤りです。ローカル証明書を生成するために使用された秘密鍵を渡す必要があります(そうでない場合、クライアントは証明書を使用できません)。秘密鍵ファイルは次のようになります。

_-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,9BA4973008F0A0B36FBE1426C198DD1B

...data...
-----END RSA PRIVATE KEY-----
_

CA証明書が必要なのは、この証明書によって署名されたSSL証明書の有効性を検証しようとしている場合のみです。その場合、おそらくSSLContext.load_verify_locations()を使用してCA証明書をロードします(最近SSLモジュールを使用したことがないので、その点でWordを使用しないでください)。

15
larsks