在具有自签名证书的python2 ssl包装中,无法使用除SSLv23之外的任何协议
我使用开放ssl生成了自签名证书在具有自签名证书的python2 ssl包装中,无法使用除SSLv23之外的任何协议,ssl,openssl,python-2.x,Ssl,Openssl,Python 2.x,我使用开放ssl生成了自签名证书 openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem 我正在使用python2,这是我的服务器代码: import socket, ssl bindsocket = socket.socket() bindsocket.bind(('localhost', 10023)) bindsocket.listen(5) while True: newsocket,
openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
我正在使用python2,这是我的服务器代码:
import socket, ssl
bindsocket = socket.socket()
bindsocket.bind(('localhost', 10023))
bindsocket.listen(5)
while True:
newsocket, fromaddr = bindsocket.accept()
connstream = ssl.wrap_socket(newsocket,
server_side=True,
certfile="cert.pem",
ssl_version=ssl.PROTOCOL_SSLv23)
try:
data = connstream.read()
print data
finally:
connstream.write('hi this is server')
connstream.shutdown(socket.SHUT_RDWR)
connstream.close()
这段代码运行得很好,我的客户端可以成功地获取“hi this is server”。但是,当我将ssl\u版本
从ssl.PROTOCOL\u SSLv23更改为ssl.PROTOCOL\u TLSv1或ssl.PROTOCOL\u SSLv3时,将出现错误:
ssl.SSLError: [Errno 1] _ssl.c:504: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
如果我将ssl_versiton更改为ssl.PROTOCOL_SSLv2:
ssl.SSLError: [Errno 1] _ssl.c:504: error:1406B0CB:SSL routines:GET_CLIENT_MASTER_KEY:peer error no cipher
这是我的客户代码,我希望这有助于产生问题:
import socket, ssl
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = ssl.wrap_socket(s,
ca_certs="cert.pem",
cert_reqs=ssl.CERT_REQUIRED)
ssl_sock.connect(('localhost', 10023))
ssl_sock.write('hi this is client')
data = ssl_sock.read()
print data
ssl_sock.close()
我不明白这些是怎么回事。如何使用SSLv23以外的协议?您是否考虑过服务器端需要密钥文件,而客户端不需要certfile 这里稍微修改了你的代码,希望能对你有所帮助
#Server side:
import socket, ssl
bindsocket = socket.socket()
bindsocket.bind(('localhost', 10023))
bindsocket.listen(5)
while True:
newsocket, fromaddr = bindsocket.accept()
connstream = ssl.wrap_socket(newsocket,
keyfile='key.pem',
server_side=True,
certfile="cert.crt",
ssl_version=ssl.PROTOCOL_SSLv23)
try:
data = connstream.read()
print data
finally:
connstream.write('hi this is server')
connstream.shutdown(socket.SHUT_RDWR)
connstream.close()
#Client side:
import socket, ssl
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
ssl_sock = ssl.wrap_socket(s,
ca_certs="cert.crt",
cert_reqs=ssl.CERT_REQUIRED
)
ssl_sock.connect(('localhost', 10023))
ssl_sock.write('hi this is client')
data = ssl_sock.read()
print data`enter code here`
ssl_sock.close()
这取决于对等方配置为接受的SSL协议以及本地配置。但是:您没有指定客户端SSL_版本,因此默认为SSLv23。2012年,您可能使用OpenSSL 0.9.8,其中SSLv23客户端发送SSLv2格式的ClientHello,请求协商到SSLv3或TLSv1。OpenSSL服务器SSLv23接受此格式并协商up,但特定协议SSLv3或TLSv1(在OpenSSL 1.0.1 up中也包括TLSv1_1或TLSv1_2)不接受旧格式。服务器协议SSLv2确实接受旧格式hello,但在这里没有找到可用的(共享)密码;我不知道为什么。无论如何,SSLv2自上个世纪以来就已被破坏,所以不要使用它。Q中显示的
openssl req
将私钥和自签名证书放在单个文件cert.pem
中,这样单个文件就足以供服务器使用;看医生。客户端将忽略密钥,只使用证书,因此也可以。