[英]Python - SSL - wrong version number
這可能只是另一個未解決的線程,但無論如何我會填寫一些信息。
我甚至連一秒鍾都無法將我的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:操作沒有完成(讀取)
另外: 我拒絕使用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例程','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))
這個作品“prefectly”在Firefox,而不是在谷歌瀏覽器。 為什么? 有什么不同? -.-
如果您的代碼中存在問題,我根本不知道Python會告訴您。
但錯誤很明顯。 客戶端支持SSLv3
而您的服務器僅支持TLSv1
。
因此,您應該啟用對SSLv3
支持或升級您的客戶端。
這一行似乎是問題所在: ssl_version=ssl.PROTOCOL_TLSv1
。 也許你也可以在這里添加SSLv3
?
更新:
我發現瀏覽器之間存在問題。 查看Crome中是否啟用了SSLv3
。
例如,在IE中,這是在Internet Options
- > Advanced Tab
。
類似的東西應該在Chrome中。 禁用SSv3
並改為啟用TLSv1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.