只是试图建立一个简单的 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。
最佳答案
您可以使用此命令生成自签名证书
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的人,只需在包装套接字时分配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
可能是您的选择,因为它提供了与其他版本的最大兼容性。关于Python 简单 SSL 套接字服务器,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11255530/