これはおそらく別の未解決のスレッドになるでしょうが、とにかくいくつかの情報を記入します。
SSLを1秒もラッピングできない。 wrap_socket()とdo_handshake()で私が間違っていることに対するアイデアはありますか?
キーファイルは100%完全であるように見え、ハンドシェイクの前に.recv()なしでANDを使用して試しました。それは私がrecv()をどこに置くかに応じてこれらを生成するだけです:
SSL3_GET_CLIENT_HELLO:間違ったバージョン番号
SSL3_GET_RECORD:間違ったバージョン番号
class Server():
def __init__(self, listen = '', port = 8080, ssl = False):
self.sock = socket.socket()
self.sock.bind((listen, port))
self.sock.listen(5)
def accept(self):
newsocket, fromaddr = self.sock.accept()
newsocket.recv(32)
newsocket.setblocking(0)
sslsock = ssl.wrap_socket(newsocket,
server_side=True,
certfile="./kernel/sock/server.crt",
keyfile="./kernel/sock/server.key",
cert_reqs=ssl.CERT_NONE,
ssl_version=ssl.PROTOCOL_TLSv1,
do_handshake_on_connect=False,
suppress_ragged_eofs=True)
sslsock.do_handshake()
return sslsock, fromaddr
記録のために、それが明白でないか私が間違っている場合、それは失敗するハンドシェイクです:)
私はコードを少し変更して、SSLv3を試し、ラッピングの位置を少し変更しました。
import socket, ssl, time, select
class Server():
def __init__(self, listen = '', port = 443, ssl = False):
self.sock = socket.socket()
self.sock.bind((listen, port))
self.sock.listen(5)
def accept(self):
self.sock = ssl.wrap_socket(self.sock,
server_side=True,
certfile="./kernel/sock/server.crt",
keyfile="./kernel/sock/server.key",
cert_reqs=ssl.CERT_NONE,
ssl_version=ssl.PROTOCOL_SSLv3,
do_handshake_on_connect=False,
suppress_ragged_eofs=True)
newsocket, fromaddr = self.sock.accept()
print [newsocket.recv(32)]
newsocket.setblocking(False)
newsocket.do_handshake()
return newsocket, fromaddr
s = Server()
ns, na = s.accept()
print ns.recv(1024)
今、私はnewsocket.recv(32)で取得します:
ssl.SSLError:[Errno 1] _ssl.c:1331:error:140940E5:SSL routines:SSL3_READ_BYTES:ssl handshake failure
となし:
ssl.SSLError:[Errno 2] _ssl.c:490:操作は完了しませんでした(読み取り)
また:Twistedの使用を拒否します
物事を縮小する:
import socket, ssl, time, select
from OpenSSL import SSL
class Server():
def __init__(self, listen = '', port = 443, ssl = False):
ctx = SSL.Context(SSL.SSLv23_METHOD)
ctx.use_privatekey_file("server.pem")
ctx.use_certificate_file("server.pem")
self.sock = SSL.Connection(ctx, socket.socket())
self.sock.bind((listen, port))
self.sock.listen(5)
def accept(self):
newsocket, fromaddr = self.sock.accept()
return newsocket, fromaddr
s = Server()
ns, na = s.accept()
print ns.recv(1024)
これは、「ネイティブ」のsslライブラリと同じように機能します。しかし、今私はこのエラーを受け取ります:
OpenSSL.SSL.Error:[( 'SSL routines'、 'SSL23_READ'、 'ssl handshake failure')]
これが私が今いるところです:
import socket, ssl, time #, select
class Server():
def __init__(self, listen = '', port = 443, ssl = False):
self.sock = socket.socket()
self.sock.bind((listen, port))
self.sock.listen(5)
def accept(self):
self.ssl_sock = None
while not self.ssl_sock:
self.ssl_sock = ssl.wrap_socket(self.sock,
server_side=True,
certfile=r"C:\moo.pem",
keyfile=r"C:\moo.key",
cert_reqs=ssl.CERT_NONE,
ssl_version=ssl.PROTOCOL_TLSv1)
newsocket, fromaddr = self.ssl_sock.accept()
print([newsocket.recv()])
return newsocket, fromaddr
s = Server()
ns, na = s.accept()
print(ns.recv(1024))
これはFirefoxでは「完全に」機能しますが、Google Chromeでは[〜#〜] not [〜#〜]です。どうして?違いは何ですか? -.-
Pythonはわかりません。コードに問題があるかどうかを教えてください。
エラーは明らかです。クライアントはSSLv3
をサポートし、サーバーはTLSv1
のみをサポートします。
そのため、SSLv3
のサポートを有効にするか、クライアントをアップグレードする必要があります。
この行が問題のようです:ssl_version=ssl.PROTOCOL_TLSv1
。おそらく、ここにSSLv3
を追加することもできますか?
更新:
ブラウザ間で問題が発生しているようです。 CromeでSSLv3
が有効になっているかどうかを確認します。
IEたとえば、これはInternet Options
-> Advanced Tab
の下にあります。
同様のものがChromeにあるはずです。代わりにSSv3
を無効にし、代わりにTLSv1
を有効にします