14

只是尝试设置一个简单的 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。

4

2 回答 2

24

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

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可能是您的选择,因为它提供了与其他版本的最大兼容性。

于 2012-12-09T06:20:57.870 回答
-1

在您的示例中,您提供了certfile,但没有keyfile。两者都是必需的。

于 2019-06-27T15:58:18.667 回答