27

Pythonでは、ssl.wrap_socketはファイルから証明書を読み取ることができ、ssl.wrap_socketはファイルパスとして証明書を必要とします。

文字列変数から読み取った証明書を使用してSSL接続を開始するにはどうすればよいですか?

私のホスト環境ではファイルへの書き込みが許可されておらず、Python2.7を
使用しているtempfileモジュールが機能していません。
証明書をMySQL内に保存し、文字列として読み取ります。

編集:私はあきらめました、これは基本的に純粋なPythonコードでSSLを実装する必要があります、これは私の現在の知識を超えています。

4

4 に答える 4

28

ソースを見ると、ssl.wrap_socketは、ファイルへのパスを必要とするネイティブコード(openssl)関数SSL_CTX_use_cert_chain_fileを直接呼び出すため、実行しようとしていることは不可能です。

参考のために:

ssl / init .pyには、次のように表示されます。

def wrap_socket(sock, keyfile=None, certfile=None,
                server_side=False, cert_reqs=CERT_NONE,
                ssl_version=PROTOCOL_SSLv23, ca_certs=None,
                do_handshake_on_connect=True):

    return SSLSocket(sock, keyfile=keyfile, certfile=certfile,
                   server_side=server_side, cert_reqs=cert_reqs,
                   ssl_version=ssl_version, ca_certs=ca_certs,
                   do_handshake_on_connect=do_handshake_on_connect)

SSLSocketコンストラクター(同じファイル内にあります)を指定すると、次のことが発生します。

self._sslobj = _ssl2.sslwrap(self._sock, server_side,
                                     keyfile, certfile,
                                     cert_reqs, ssl_version, ca_certs)

_ssl2はC(_ssl2.c)で実装されています

sslwrap関数を見ると、新しいオブジェクトが作成されていることがわかります。

    return (PyObject *) newPySSLObject(Sock, key_file, cert_file,
                                       server_side, verification_mode,
                                       protocol, cacerts_file);

そのオブジェクトのコンストラクターを見ると、最終的に次のことがわかります。

            ret = SSL_CTX_use_certificate_chain_file(self->ctx,
                                                     cert_file);

その関数はopensslで定義されているので、次にそのコードベースに切り替える必要があります。

ssl / ssl_rsa.cでは、最終的に次の関数が見つかります。

BIO_read_filename(in,file) 

BIOコード(opensslの一部)を十分に掘り下げると、最終的には通常のfopen()に到達します。

fp=fopen(ptr,p);

つまり、現在書かれているように見えます。Cのfopen()で開くことができるファイルに含まれている必要があります。

また、PythonのsslライブラリはすぐにCにジャンプするため、回避策としてモンキーパッチを適用する場所がすぐにわかりません。

于 2012-12-16T21:53:10.193 に答える
5

ssl モジュールのソースを確認すると、必要なものが API でサポートされていないことがわかります: http://code.google.com/codesearch#2T6lfGELm_A/trunk/Modules/_ssl.c&q=sslwrap&type=cs

不可能だと言っているわけではありません。名前付きパイプを作成し、Python から一端を供給して、ファイル名を ssl モジュールに与えることができます。

より単純で安全性の低い使用法として、証明書をメモリから mkstemp() されたファイルにダンプします。

FUSE ボリュームをマウントして、ファイル コールバックをインターセプトすることもできます。

最後に、ctypes を使用して実行時に ssl コンテキストをハックし、C レシピに従ってバッファから cert/ket をロードします OpenSSL を使用して、ファイルの代わりにメモリから証明書ファイルを読み取ります.

たとえば、アプリ エンジンの「刑務所」から抜け出そうとしているようですが、おそらくそれは不可能ですか?

SSL の実装にこだわりがない場合は、M2Crypto、TLS Lite、pyOpenSSL などを使用できます。以前のものは純粋な python です。間違いなくハッキングして、メモリ内の証明書/キーを使用できます。

于 2012-12-19T19:55:51.687 に答える
-2

StringIOを使用すると、文字列をファイルのように扱うことができます。

于 2012-09-09T23:48:43.570 に答える