如何在 Twisted 中使用 startTLS?

问题描述 投票:0回答:1

我想建立与服务器的非加密连接,然后在发送商定的命令后切换到 TLS 加密连接。看起来 Twisted 的

startTLS
正是为了这个目的 - 除了我无法让它工作,甚至连 Twisted 的 官方文档 中给出的例子也不行。

显然,这些示例依赖于一个名为

server.pem
的外部文件。在文档该页面的较高位置,它说该文件是“私钥和自签名证书”。所以,我使用 OpenSSL 来创建它:

openssl req -x509 -newkey rsa:4096 -keyout serverkey.pem -out servercert.pem -sha256 -days 3650 -nodes -subj "/CN=localhost"
copy serverkey.pem+servercert.pem server.pem

如果我现在运行服务器示例,

starttls_server.py
,它工作正常 - 但如果我运行客户端示例,
starttls_client.py
,它会崩溃并出现堆栈跟踪和错误

service_identity.exceptions.CertificateError: Certificate does not contain any `subjectAltName`s.

我不知道这意味着什么(谷歌搜索没有帮助),但对我来说,客户端和服务器都使用相同的

server.pem
文件似乎很奇怪。虽然我看不出这个想法在理论上有什么问题,但实际上客户端和服务器几乎不可能拥有相同的私钥,所以也许
pyOpenSSL
包含某种检查来报告这样的奇怪现象:错误。

因此,我创建了另一个私钥和自签名证书,并将它们存储在名为

client.pem

的文件中
openssl req -x509 -newkey rsa:4096 -keyout clientkey.pem -out clientcert.pem -sha256 -days 3650 -nodes -subj "/CN=localhost"
copy clientkey.pem+clientcert.pem client.pem

并修改了文件

starttls_client.py
以使用
client.pem
而不是
server.pem

结果有点有效,从某种意义上说,客户端不再崩溃 - 但它并没有真正起作用,因为它没有做它应该做的事情。

查看代码,服务器应该打印客户端发送的每一行,如果该行是

STARTTLS
,则要打印
-- Switching to TLS
,将行
READY
发送到客户端,然后调用
startTLS

客户端在与服务器建立连接后,应该发送行

plain text
,然后发送
STARTTLS
。如果它从服务器收到线路
READY
,则应该调用
startTLS
,然后将线路
secure text
发送到服务器。

实际发生的事情是:

服务器打印

received:  b'plain text'
received:  b'STARTTLS'
-- Switching to TLS

意味着它确实收到了来自客户端的 plantext 行,然后是切换到 TLS 加密连接的命令,并且已调用

startTLS

客户端仅打印

received:  b'READY'

然后退出。也就是说,此时它已与服务器建立了非加密通信,已发送切换到 TLS 加密通信的命令,并已收到服务器的(明文)确认。此时,通信应该是 TLS 加密的,因此客户端可能已将行

secure text
发送到服务器并退出。

除了服务器从不打印

secure text
,所以显然它没有收到这一行。

此时我很困惑。我期望至少 Twisted 文档中的示例能够“按原样”工作,但显然情况并非如此。有什么想法可能是错的吗?我生成的私钥和自签名证书有问题吗? PEM 文件是我自己创建的唯一文件,而不是直接使用 Twisted 文档中的内容。

python twisted
1个回答
0
投票

service_identity.exceptions.CertificateError:证书不包含任何

subjectAltName
s。

subjectAltName
是与 TLS 一起使用的 X509v3 扩展。 它取代了 X509 中使用的原始“通用名称”字段。 “通用名称”检查已被 RFC 2818(2000 年)弃用,例如,浏览器在 5 到 10 年前就停止支持“通用名称”。

不幸的是,OpenSSL 命令行仍然会愉快地使用通用名称而不是

subjectAltName
创建证书,这就是您用来创建证书的命令所做的。

如何使用 OpenSSL 生成具有SubjectAltName 的自签名证书? 涵盖了该主题,并有一个答案,其中包含生成带有

subjectAltName
字段的证书的说明。

请注意,问题仅与证书有关。 它与

startTLS
没有特别关系。

© www.soinside.com 2019 - 2024. All rights reserved.