Python简单SSL套接字服务器

Cap*_*rin 11 python openssl

只是尝试设置一个简单的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)
Run Code Online (Sandbox Code Playgroud)

那里的### s后面的那行是不工作的.我不知道我要用openssl做什么来生成一个可以在这里工作的PEM文件.

任何人都可以告诉我如何使这个简单的套接字工作.

顺便说一句,这不用于HTTP.

Bri*_*ian 9

您可以使用此命令生成自签名证书

openssl req -new -x509 -days 365 -nodes -out cert.pem -keyout cert.pem
Run Code Online (Sandbox Code Playgroud)

openssl框架会要求您输入一些信息,例如您所在的国家/地区,城市等.只需按照说明操作,您将获得一个cert.pem文件.输出文件将包含用于生成公钥的RSA私钥和证书.输出文件如下所示:

-----BEGIN RSA PRIVATE KEY-----
 # your private key
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
 # your certificate
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

只需加载它,ssl模块将为您处理剩下的事情:

context.load_cert_chain(certfile="cert.pem", keyfile="cert.pem")
Run Code Online (Sandbox Code Playgroud)

顺便说一下,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) 
Run Code Online (Sandbox Code Playgroud)

可用的SSL版本:ssl.PROTOCOL_TLSv1,ssl.PROTOCOL_SSLv2,ssl.PROTOCOL_SSLv3,ssl.PROTOCOL_SSLv23.如果你不知道,ssl.PROTOCOL_SSLv23可能是你的选择,因为它提供了与其他版本最大的兼容性.

  • 我知道这是一个旧帖子,但由于POODLE漏洞,没有人应该建议使用SSLv3而不是TLS.有关更多信息,请访问https://en.wikipedia.org/wiki/POODLE (2认同)