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

Python SSL服务器提供中间CA证书,python,ssl,certificate,ca,Python,Ssl,Certificate,Ca,我正在使用Python(2.7)SSL模块编写一些服务器代码,如下所示: ssock=ssl.wrap\u套接字(sock,ca\u certs=“all-ca.crt”,keyfile=“server.key”,certfile=“server.crt”,server\u side=True,ssl\u version=ssl.PROTOCOL\u TLSv1) “all-ca.crt”包含签名ca证书和根ca证书: -----BEGIN CERTIFICATE----- ... (signi

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

ssock=ssl.wrap\u套接字(sock,ca\u certs=“all-ca.crt”,keyfile=“server.key”,certfile=“server.crt”,server\u side=True,ssl\u version=ssl.PROTOCOL\u 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\u套接字(sock,ca\u certs=“root-ca.crt”,cert\u reqs=ssl.cert\u REQUIRED,ssl\u version=ssl.PROTOCOL\u TLSv1)

然后引发一个异常:

ssl.SSLError:[Errno 1]\u ssl.c:499:error:14094418:ssl 例程:SSL3_读取字节:tlsv1警报未知ca

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


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

在服务器端,使用
CA\u certs
选项验证客户端的证书。(如果
CERT\u REQUIRED
设置为
True
,服务器将要求客户端提供其证书)

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

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


生成证书链。

“服务器将只向客户端发送自己的证书。此行为符合TLS协议的规定。”实际上,TLS协议允许发送证书链。@Bruno:事实上,TLS协议要求发送完整的证书链。引用:“证书列表-这是一个证书序列(链)。发送者的证书必须位于列表的第一位。下面的每个证书都必须直接证明它前面的证书。”根证书是可选的,所有其他中间证书都不是。另请参见。您是否尝试将您的服务器证书及其链捆绑到
server.crt
?谢谢Bruno,成功了。