只是尝试设置一个简单的SSL服务器。我过去从未有过任何SSL工作。我对SSL证书和签名方式有一个疏忽的了解。
代码很简单
import socket, ssl
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
context.load_cert_chain(certfile="mycertfile") ###############
bindsocket = socket.socket()
bindsocket.bind(('', 2099))
bindsocket.listen(5)
while True:
newsocket, fromaddr = bindsocket.accept()
sslsoc = context.wrap_socket(newsocket, server_side=True)
request = sslsoc.read()
print(request)
那里的### s后面的那行是不工作的。我不知道我要用openssl做什么来生成一个可以在这里工作的PEM文件。
任何人都可以告诉我如何使这个简单的套接字工作。
顺便说一句,这不用于HTTP。
答案 0 :(得分:9)
您可以使用此命令生成自签名证书
openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
openssl框架会要求您输入一些信息,例如您所在的国家/地区,城市等。只需按照说明操作,您将获得cert.pem
文件。输出文件将包含用于生成公钥的RSA私钥和证书。
输出文件如下所示:
-----BEGIN RSA PRIVATE KEY-----
# your private key
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
# your certificate
-----END CERTIFICATE-----
只需加载它,ssl模块将为您处理其余部分:
context.load_cert_chain(certfile="cert.pem", keyfile="cert.pem")
顺便说一下,python2中有没有“SSLContext”。对于使用python2的人来说,只需在包装socket时分配pem文件:
newsocket, fromaddr = bindsocket.accept()
connstream = ssl.wrap_socket(newsocket,
server_side=True,
certfile="cert.pem",
keyfile="cert.pem",
ssl_version=YOUR CHOICE)
可用的ssl版本:ssl.PROTOCOL_TLSv1
,ssl.PROTOCOL_SSLv2
,ssl.PROTOCOL_SSLv3
,ssl.PROTOCOL_SSLv23
。如果你不知道,ssl.PROTOCOL_SSLv23
可能是你的选择,因为它提供了与其他版本最大的兼容性。
答案 1 :(得分:0)
在您的示例中,您提供了certfile
,但没有提供keyfile
。两者都是必需的。