Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在具有自签名证书的python2 ssl包装中,无法使用除SSLv23之外的任何协议_Ssl_Openssl_Python 2.x - Fatal编程技术网

在具有自签名证书的python2 ssl包装中,无法使用除SSLv23之外的任何协议

在具有自签名证书的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,

我使用开放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, 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
中,这样单个文件就足以供服务器使用;看医生。客户端将忽略密钥,只使用证书,因此也可以。