5

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パラメーターの両方に同じファイル名を指定しています。

4

2 に答える 2

4

openSSLメーリングリストで、私はMounirIdrassiとチャットしました。彼は、openSSLはPKCS#12ファイルをサポートしており、私が受け取ったエラーメッセージに基づいて、httplibがキーをロードするために間違った関数を呼び出しているようだと述べました。

彼の言葉で:

発生しているエラーに関して、使用しているphythonモジュールがPKCS#12ファイル名を指定してSSL_CTX_use_PrivateKey_fileを呼び出しているようです。これは、SSL_CTX_use_PrivateKey_fileがSSL_FILETYPE_PEMとSSL_FILETYPE_ASN1の2つの形式しか受け入れないためではありません。

(このファイル形式には同じファイルに証明書と秘密鍵の両方が含まれているため、httplibにPKCS#12ファイル名をキーファイルとして指定しています。)

これを修正するには、2つの解決策があります。--PEMファイルの秘密鍵をPythonモジュールにフィードします。-または、上記のPKCS#12関数を使用して秘密鍵をEVP_PKEYとして抽出し、SSL_CTX_use_PrivateKey_fileの代わりにSSL_use_PrivateKeyを呼び出し、関連する証明書を設定するために、このpythonモジュールのソースコードを変更します。

(前者を試しましたが、動作させることができませんでした。必ずしも動作しないという意味ではありません。動作しなかっただけです。)

于 2010-04-15T15:08:13.697 に答える
4

これは当然のことです。Pythonライブラリのリファレンスドキュメントは、これについてかなり明確です。http://docs.python.org/library/httplib.htmlから:

クラスhttplib。HTTPSConnection(host [、port [、key_file [、cert_file [、strict [、timeout [、source_address]]]]]])

安全なサーバーとの通信にSSLを使用するHTTPConnectionのサブクラス。デフォルトのポートは443です。key_fileは、秘密鍵を含むPEM形式のファイルの名前です。cert_fileは、PEM形式の証明書チェーンファイルです。

于 2011-12-20T21:40:59.520 に答える