[英]Python simple SSL communication
我想在客户端和用 python 3 编写的服务器之间启动一个简单的 SSL 连接,但出现错误。
这是服务器代码:
#/usr/bin/python3
import socket
import ssl
HOST, PORT = '0.0.0.0', 12345
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.bind((HOST, PORT))
sock.listen(10)
client, addr = sock.accept()
# WRAP SOCKET
wrappedSocket = ssl.wrap_socket(client, server_side=True, ssl_version=ssl.PROTOCOL_SSLv23, ciphers="ADH-AES256-SHA")
# CONNECT AND PRINT REPLY
print(wrappedSocket.recv(1024))
# CLOSE SOCKET CONNECTION
wrappedSocket.close()
这是客户端代码:
#/usr/bin/python3
import socket
import ssl
HOST, PORT = '127.0.0.1', 12345
# CREATE SOCKE
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# WRAP SOCKET
wrappedSocket = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_SSLv23, ciphers="ADH-AES256-SHA")
# connect and send a message
wrappedSocket.connect((HOST, PORT))
wrappedSocket.send(b"Hello")
wrappedSocket.close()
这是我在服务器端遇到的错误:
回溯(最近一次调用最后一次):
文件“server.py”,第 18 行,在
WrappedSocket = ssl.wrap_socket(client, server_side=True, ssl_version=ssl.PROTOCOL_SSLv23, ciphers="ADH-AES256-SHA")
文件“/usr/lib/python3.4/ssl.py”,第 890 行,在 wrap_socket ciphers=ciphers)
文件“/usr/lib/python3.4/ssl.py”,第 509 行,在init raise ValueError("certfile must be specified for server-side "
ValueError:必须为服务器端操作指定证书文件
拜托,我可不想一个复杂的SSL连接,我只是寻找到客户端和服务器之间的数据进行加密,可能最简单的方法,就像ncat
与--ssl
选项( ncat --ssl -l -p 12345
来自服务器端,而ncat --ssl 127.0.0.1 12345
来自客户端)。
PS:我使用的是 Ubuntu 15.10 和 Python 3。
您可以使用openssl
生成自签名证书,并在wrap_socket中指定certfile
属性和keyfile
属性服务器端
生成RSA公钥/私钥对
openssl genrsa -out private.pem 2048
生成自签名证书
openssl req -new -x509 -key private.pem -out cacert.pem -days 1095
使用SSL作为安全协议将需要您创建或购买SSL证书,因为这是握手的必需部分。
来自RFC 6101
5.6.2。 服务器证书
如果要对服务器进行身份验证(通常是这种情况),则服务器会在服务器问候消息之后立即发送其证书。 证书类型必须适合
选择的密码套件的密钥交换算法,通常是X.509.v3证书
将您的证书文件传递给包装器:
from http.server import HTTPServer, SimpleHTTPRequestHandler
import ssl
httpd = HTTPServer(('localhost', 4443), SimpleHTTPRequestHandler)
httpd.socket = ssl.wrap_socket(httpd.socket,
certfile='/tmp/tcert_key.pem', server_side=True)
httpd.serve_forever()
然后,您必须为自签名的安全私钥输入密码。 集成的密钥文件(certfile)可以用 cat 生成或在 shell 中输入:
输入 tkey.pem tcert.pem > tcert_key.pem
相当于:
$ cat file1 file2 > file3
可以删除安全服务器端案例的私钥文件的密码短语。 OpenSSL 提供了工具来做到这一点。 例如:
openssl pkey -in yourkey-with-pass.pem -out yourkey-without-pass.pem
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.