Web.py上的SSL证书链不完整

时间:2017-05-04 05:03:34

标签: python ssl ssl-certificate 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
    

    ...在认证路径下,中间体标记为"额外下载"而不是"由服务器"

  • 发送

我尝试了一些不同的文件内容和文件扩展名组合。

E.g。我尝试过:

  • 只有中间证书;
  • 中间体和根证书;
  • 域名,中间人和root

...进入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

1 个答案:

答案 0 :(得分:2)

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))