web.py 上的 SSL 证书链不完整
SSL certificate chain incomplete on web.py
我不知道如何在 web.py 应用程序上正确设置 SSL 证书链...
在 python 代码中我有:
CherryPyWSGIServer.ssl_certificate = "/path/mycert.pem"
CherryPyWSGIServer.ssl_certificate_chain = "/path/mychain.ca-bundle"
CherryPyWSGIServer.ssl_private_key = "/path/mykey.key"
当我访问 Chrome 中的域时,它说它是安全的。
然而,
当我尝试从 Rails 应用程序发送 webhooks 时,它响应:
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
如果我尝试在命令提示符下使用 openssl 进行连接,如下所示:
openssl s_client -showcerts -connect mydomain.com:443
..它只显示域的证书,不显示链的其余部分,输出包含错误消息:
verify error:num=20:unable to get local issuer certificate
verify error:num=21:unable to verify the first certificate
如果我 运行 通过 Qualys SSL Server Test 的域,虽然它以 B 评级通过,但在证书下它说:
Chain issues Incomplete
...在证书路径下,中间体标记为 "Extra download" 而不是 "Sent by server"
我尝试了一些不同的文件内容和文件扩展名组合。
例如我试过输入:
- 只有中级证书;
- 中间件和根证书;
- 域、中间体和根
...进入 certificate_chain 文件。我也试过在证书文件中包含整个链。我试过扩展名 .crt、.pem、.perm、.ca-bundle
有人对正确的文件格式、包含方法、文件扩展名或我可能需要的任何其他配置选项有任何建议吗?谢谢!
P.S。 Python 版本为 2.7.12
pip freeze 显示安装了以下软件包:
cffi==1.8.3
cryptography==1.5.2
enum34==1.1.6
idna==2.1
ipaddress==1.0.17
pyasn1==0.1.9
pycparser==2.16
pyOpenSSL==16.2.0
requests==2.11.1
six==1.10.0
web.py==0.38
web.py
v0.38 不使用开箱即用的证书链。这意味着它会忽略您的 CherryPyWSGIServer.ssl_certificate_chain
编辑,因为它没有通过。
幸运的是,根据 https://github.com/movb/webpy/commit/9f9f6838e49f17cf395282392c3fc2762a97460b
,有一个简单的补丁
编辑 web/httpserver.py
,以通过 ssl_certificate_chain
(如果已定义)。然后你的代码就可以工作了。
== web/httpserver.py ==
- def create_ssl_adapter(cert, key):
+ def create_ssl_adapter(cert, key, chain=None):
- adapter = pyOpenSSLAdapter(cert, key)
+ adapter = pyOpenSSLAdapter(cert, key, chain)
- server.ssl_adapter = crate_ssl_adapter(server.ssl_certificate, server.ssl_private_key)
+ server.ssl_adapter = create_ssl_adapter(server.ssl_certificate, server.ssl_private_key,
+ getattr(server, 'ssl_certificate_chain', None))
我不知道如何在 web.py 应用程序上正确设置 SSL 证书链...
在 python 代码中我有:
CherryPyWSGIServer.ssl_certificate = "/path/mycert.pem"
CherryPyWSGIServer.ssl_certificate_chain = "/path/mychain.ca-bundle"
CherryPyWSGIServer.ssl_private_key = "/path/mykey.key"
当我访问 Chrome 中的域时,它说它是安全的。
然而,
当我尝试从 Rails 应用程序发送 webhooks 时,它响应:
SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed
如果我尝试在命令提示符下使用 openssl 进行连接,如下所示:
openssl s_client -showcerts -connect mydomain.com:443
..它只显示域的证书,不显示链的其余部分,输出包含错误消息:
verify error:num=20:unable to get local issuer certificate verify error:num=21:unable to verify the first certificate
如果我 运行 通过 Qualys SSL Server Test 的域,虽然它以 B 评级通过,但在证书下它说:
Chain issues Incomplete
...在证书路径下,中间体标记为 "Extra download" 而不是 "Sent by server"
我尝试了一些不同的文件内容和文件扩展名组合。
例如我试过输入:
- 只有中级证书;
- 中间件和根证书;
- 域、中间体和根
...进入 certificate_chain 文件。我也试过在证书文件中包含整个链。我试过扩展名 .crt、.pem、.perm、.ca-bundle
有人对正确的文件格式、包含方法、文件扩展名或我可能需要的任何其他配置选项有任何建议吗?谢谢!
P.S。 Python 版本为 2.7.12 pip freeze 显示安装了以下软件包:
cffi==1.8.3
cryptography==1.5.2
enum34==1.1.6
idna==2.1
ipaddress==1.0.17
pyasn1==0.1.9
pycparser==2.16
pyOpenSSL==16.2.0
requests==2.11.1
six==1.10.0
web.py==0.38
web.py
v0.38 不使用开箱即用的证书链。这意味着它会忽略您的 CherryPyWSGIServer.ssl_certificate_chain
编辑,因为它没有通过。
幸运的是,根据 https://github.com/movb/webpy/commit/9f9f6838e49f17cf395282392c3fc2762a97460b
,有一个简单的补丁编辑 web/httpserver.py
,以通过 ssl_certificate_chain
(如果已定义)。然后你的代码就可以工作了。
== web/httpserver.py ==
- def create_ssl_adapter(cert, key):
+ def create_ssl_adapter(cert, key, chain=None):
- adapter = pyOpenSSLAdapter(cert, key)
+ adapter = pyOpenSSLAdapter(cert, key, chain)
- server.ssl_adapter = crate_ssl_adapter(server.ssl_certificate, server.ssl_private_key)
+ server.ssl_adapter = create_ssl_adapter(server.ssl_certificate, server.ssl_private_key,
+ getattr(server, 'ssl_certificate_chain', None))