3

opensslを使用して自己署名証明書を生成しました

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()

このコードはうまく機能し、私のクライアントは「こんにちは、これはサーバーです」を正常に取得できます。ただし、ssl_versionをssl.PROTOCOL_SSLv23からssl.PROTOCOL_TLSv1またはssl.PROTOCOL_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以外のプロトコルを使用するにはどうすればよいですか?

4

1 に答える 1