【问题标题】:Python SSL server to provide intermediate CA certificates提供中间 CA 证书的 Python SSL 服务器
【发布时间】:2013-07-23 16:43:36
【问题描述】:

我正在使用 Python (2.7) SSL 模块编写一些服务器代码,如下所示:

ssock = ssl.wrap_socket(sock, ca_certs="all-ca.crt", keyfile="server.key", certfile="server.crt", server_side=True, ssl_version=ssl.PROTOCOL_TLSv1)

“all-ca.crt”包含签名 CA 证书和根 CA 证书:

-----BEGIN CERTIFICATE-----
... (signing CA)...
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
... (root CA)...
-----END CERTIFICATE-----

Python SSL 模块的文档说明:

一般情况下,如果您使用的是 SSL3 或 TLS1,则无需将 “CA 证书”文件中的完整链;你只需要根 证书,并且远程对等方应该提供另一个 从其证书链接到根所需的证书 证书。

这是我用 C 语言编写 SSL 服务器的经验。但它似乎在这里不起作用。如果我编写一个在其 wrap_socket() 调用中仅使用根证书的客户端:

csock = ssl.wrap_socket(sock, ca_certs="root-ca.crt", cert_reqs=ssl.CERT_REQUIRED, ssl_version=ssl.PROTOCOL_TLSv1)

然后引发异常:

ssl.SSLError: [Errno 1] _ssl.c:499: error:14094418:SSL 例程:SSL3_READ_BYTES:tlsv1 alert unknown ca

如果我改为将 all-ca.crt 传递给客户端 ca_certs 参数,那么一切都会按预期进行,但这在客户端不方便并且不应该是必需的。

有什么方法可以告诉服务器端它需要在协商时向客户端提供中间 CA 证书?

【问题讨论】:

  • 您是否尝试将您的服务器证书及其链捆绑到server.crt
  • 感谢布鲁诺,成功了。

标签: python ssl certificate ca


【解决方案1】:

在服务器端,ca_certs 选项用于验证客户端的证书。 (如果CERT_REQUIRED 设置为True,服务器将要求客户端提供其证书)。

事实上,ca_certs 中的 CA 证书不会发送给客户端。服务器只会将自己的证书发送给客户端。但是你可以把所有的中间证书和你服务器的证书放到你的server.crt.中,比如使用

cat server.crt intermediate-ca.crt root-ca.crt > server-chain.crt

生产链条。

【讨论】:

  • "服务器只会将自己的证书发送给客户端。这种行为是根据 TLS 协议的。" 并非如此,TLS 协议允许发送证书链.
  • @Bruno:事实上,TLS 协议要求发送完整的链。引用RFC 5246:“certificate_list - 这是证书的序列(链)。发件人的证书必须在列表中排在第一位。后面的每个证书都必须直接证明它前面的证书。”根证书是可选的,所有其他中间证书都不是。另见this similar question on security.SE
猜你喜欢
  • 1970-01-01
  • 2021-01-29
  • 2015-09-26
  • 1970-01-01
  • 2015-11-01
  • 2011-07-07
  • 2015-10-20
  • 1970-01-01
  • 2015-05-11
相关资源
最近更新 更多