【问题标题】:Python Simple SSL Socket ServerPython 简单 SSL 套接字服务器
【发布时间】:2023-03-26 05:36:01
【问题描述】:

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

【问题讨论】:

  • 如果你愿意使用 twisted,这里有一个使用 OpenSSL 的好例子:twistedmatrix.com/documents/current/core/howto/ssl.html 看起来需要证书和公钥,其中证书是用公钥的私钥签名的对。
  • 这很好,而且看起来相当简单,但我需要的只是生成要使用的正确文件的命令。我不久前尝试过,但出现了非常奇怪的错误。显然我没有正确签名或使用正确的文件。
  • 这方面的教程好像很多,你有没有试过按照这个来做? devsec.org/info/ssl-cert.html
  • 尝试:openssl req -x509 -nodes -days 7 -newkey rsa:2048 -keyout mycertfile.pem -out mycertfile.pem(谷歌'创建自签名测试证书')
  • 以后发布到 SO 时,请不要只说“它不起作用”,如果出现异常、错误消息或其他任何诊断信息,请在问题中包含此内容。逐字逐句,所以复制和粘贴,不要编辑信息。这将有助于获得正确的答案。此外,当您发现问题时,您应该将其发布为答案并接受它。它将帮助未来的访问者更轻松地找到它。

标签: python openssl


【解决方案1】:

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

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 中有 no "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_TLSv1ssl.PROTOCOL_SSLv2ssl.PROTOCOL_SSLv3ssl.PROTOCOL_SSLv23。如果您不知道,ssl.PROTOCOL_SSLv23 可能是您的选择,因为它提供了与其他版本的最大兼容性。

【讨论】:

  • 创建context,调用ssl.create_default_context函数(它也适用于最近的Python 2版本)。
  • 我知道这是一篇旧帖子,但由于 POODLE 漏洞,没有人应该建议在 TLS 上使用 SSLv3。更多信息en.wikipedia.org/wiki/POODLE
【解决方案2】:

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

【讨论】:

  • 你注意没问题,但你应该用 cmets 说。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-28
  • 2016-07-31
  • 2015-06-18
相关资源
最近更新 更多