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以外のプロトコルを使用するにはどうすればよいですか?