これはおそらく別の未解決のスレッドになりますが、とにかくいくつかの情報を入力します。
一瞬でもSSLをまとめることができません。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:エラー:140940E5:SSLルーチン:SSL3_READ_BYTES:sslハンドシェイクの失敗
なし:
ssl.SSLError:[Errno 2] _ssl.c:490:操作が完了しませんでした(読み取り)
また:私はツイストを使用することを拒否します
物事を縮小する:
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ルーチン'、'SSL23_READ'、'sslハンドシェイクの失敗')]
これは私が今いるところです:
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では「完全に」機能しますが、GoogleChromeでは機能しません。なんで?違いは何ですか?-.-