Python3.2で正常に機能する単純なクライアント/サーバーSSLコードがあります。しかし、(サードパーティのモジュールが豊富なため)2.7に切り替えることにしました。現在、コードは失敗しています。コードは次のとおりです。
クライアント:
def connect(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect(('localhost', 4430))
self.ssl_sock = ssl.wrap_socket(self.sock, cert_reqs = ssl.CERT_NONE, ssl_version = ssl.PROTOCOL_TLSv1)
サーバ:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind((self.hostname, 4430))
self.sock.listen(5)
while True:
self.newsocket, self.fromaddr = self.sock.accept()
self.ssl_sock = ssl.wrap_socket(
self.newsocket,
server_side = True,
certfile = "cert.pem",
ssl_version=ssl.PROTOCOL_TLSv1
)
self._handle_client(self.ssl_sock)
cert.pem(サーバーの.pyファイルと同じディレクトリにあります):
-----BEGIN RSA PRIVATE KEY-----
(812 "random" characters here)
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
(1260 "random" characters here)
-----END CERTIFICATE-----
失敗は次のとおりです
。1。サーバーはself.sock.accept()を待機します
。2。クライアントはself.sock.connect()に接続します。3
。サーバーはwrap_socketに進みますが、次のエラーで失敗します。
Traceback (most recent call last):
File "C:\Program Files\Python27\lib\multiprocessing\process.py", line 258, in _bootstrap
self.run()
File "C:\workspace\projectc\server\server\clientlistener.py", line 49, in run
ssl_version=ssl.PROTOCOL_TLSv1
File "C:\Program Files\Python27\lib\ssl.py", line 381, in wrap_socket
ciphers=ciphers)
File "C:\Program Files\Python27\lib\ssl.py", line 141, in __init__
ciphers)
SSLError: [Errno 336265218] _ssl.c:351: error:140B0002:SSL routines:SSL_CTX_use_PrivateKey_file:system lib
PS
1)certfileに存在しないファイルを使用しても同じエラーが発生するため、wrap_socket呼び出しに疑いがあります。
2)sslのPythonドキュメントで別のラッピングを試しました(つまり、ssl.SSLContextを使用)。sslモジュールの一部である場合、「module」オブジェクトに属性「SSLContext」がないのは奇妙です。Python 3.2で試したとき、これは問題ではありませんでした。
更新:
この問題は、Eclipse内から「実行」を実行している場合にのみ発生し、別々のコマンドプロンプトから両方のファイルを実行している場合には発生しないことがわかりました。まだ問題を調査しています...
更新2: 同じコードを使用して非常に単純なクライアント/サーバースクリプトを試しましたが、機能します。現在、サーバーコードがマルチプロセッシングサブプロセス(メインサーバープロセスによって起動される)内にあるため、機能していないようです。関連している?