PKCS#12証明書を使用して、クライアントの検証にhttplibのHTTPSConnectionを使用しようとしています。MSIEとFirefoxで証明書を使用してサーバーに接続できるので、証明書が適切であることはわかっています。
これが私の接続機能です(証明書には秘密鍵が含まれています)。私はそれを基本だけに絞り込みました:
def connect(self, cert_file, host, usrname, passwd):
self.cert_file = cert_file
self.host = host
self.conn = httplib.HTTPSConnection(host=self.host, port=self.port, key_file=cert_file, cert_file=cert_file)
self.conn.putrequest('GET', 'pathnet/,DanaInfo=200.222.1.1+')
self.conn.endheaders()
retCreateCon = self.conn.getresponse()
if is_verbose:
print "Create HTTPS connection, " + retCreateCon.read()
(注:ハードコードされたパスについてのコメントはありません。最初にこれを機能させようとしています。後できれいにします。ハードコードされたパスは、MSIEとFirefoxで接続しているので正しいです。 。投稿のIPアドレスを変更しました。)
PKCS#12証明書(.pfxファイル)を使用してこれを実行しようとすると、openSSLエラーのように見えるものが返されます。エラートレースバック全体は次のとおりです。
ファイル"Usinghttplib_Test.py"、行175、 t.connect(cert_file = opts ["-keys"]、host = host_name、usrname = opts ["-username"]、passwd = opts ["-password"]) ファイル「Usinghttplib_Test.py」、40行目、接続 self.conn.endheaders() エンドヘッダーのファイル"c:\ python26 \ lib \ httplib.py"、行904 self._send_output() _send_outputのファイル"c:\ python26 \ lib \ httplib.py"、行776 self.send(msg) ファイル"c:\ python26 \ lib \ httplib.py"、735行目、送信中 self.connect() ファイル"c:\ python26 \ lib \ httplib.py"、行1112、接続 self.sock = ssl.wrap_socket(sock、self.key_file、self.cert_file) wrap_socket内のファイル"c:\ python26 \ lib \ ssl.py"、行350 suppress_ragged_eofs = suppress_ragged_eofs) __init__のファイル"c:\ python26 \ lib \ ssl.py"、行113 cert_reqs、ssl_version、ca_certs)ssl.SSLError:[Errno 336265225] _ssl.c:337:エラー:140B0009:SSLルーチン:SSL_CTX_use_PrivateKey_file:PEMlib
openSSLエラー(リストの最後のエントリ)が「PEMlib」を示していることに注意してください。これは、PEM証明書を使用しようとしていないため、奇妙なことに気づきました。
キックについては、PKCS#12証明書をPEM証明書に変換し、それを使用して同じコードを実行しました。その場合、エラーは発生せず、PEMパスフレーズの入力を求められ、コードはサーバーに到達しようとしました。(「サービスを利用できません。しばらくしてからもう一度お試しください。」という応答がありましたが、サーバーがPEM証明書を受け入れていないためだと思います。FirefoxでPEM証明書を使用してサーバーに接続することもできません。 。)
httplibのHTTPSConnectionはPCKS#12証明書をサポートすることになっていますか?(つまり、pfxファイルです。)そうであれば、openSSLがPEM lib内にロードしようとしているように見えるのはなぜですか?私はこれをすべて間違っていますか?
どんなアドバイスでも大歓迎です。
編集:証明書ファイルには証明書と秘密鍵の両方が含まれているため、HTTPSConnectionのkey_fileパラメーターとcert_fileパラメーターの両方に同じファイル名を指定しています。