Python SSL服务器提供中间CA证书

时间:2013-07-24 09:27:46

标签: python ssl certificate ca

我正在使用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:错误:14094418:SSL   例程:SSL3_READ_BYTES:tlsv1 alert unknown ca

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

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

1 个答案:

答案 0 :(得分:3)

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

实际上,ca_certs中的CA证书不会发送给客户端。服务器只会将自己的证书发送给客户端。但您可以将所有中间证书和服务器证书放入server.crt.例如,使用

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

生产链条。