如何修复 SSL 问题 SSL_CTX_use_certificate:Python Zeep 上的 ca md 太弱

How to fix SSL issue SSL_CTX_use_certificate : ca md too weak on Python Zeep

我的代码之前一直在工作,直到每当我向 Frontierlink Web 服务发出 SOAP 请求时出现此错误。

File "/home/venv/lib/python2.7/site-packages/OpenSSL/_util.py", line 54, in exception_from_error_queue
raise exception_type(errors)

OpenSSL.SSL.Error: [('SSL routines', 'SSL_CTX_use_certificate', 'ca md too weak')]

我是否需要重新生成我用来连接的 pem 文件,或者问题出在我用来生成 pem 文件的 .p12 文件上?

如果您需要有关我的问题的更多信息,请告诉我。

备注:

我使用的 OpenSSL 版本是:OpenSSL 1.0.2k-fips

提前致谢!

您收到的错误消息表明您使用的证书是使用 md5 哈希签名的。

OpenSSL 1.1.0 引入了一项名为 security level 的新功能。
1的默认设置会导致如下(我强调):

The security level corresponds to a minimum of 80 bits of security. Any parameters offering below 80 bits of security are excluded. As a result RSA, DSA and DH keys shorter than 1024 bits and ECC keys shorter than 160 bits are prohibited. All export cipher suites are prohibited since they all offer less than 80 bits of security. SSL version 2 is prohibited. Any cipher suite using MD5 for the MAC is also prohibited.

您可能需要重新生成证书并使用更强的哈希来签名,例如SHA1

从 post OpenSSL Users 的论坛判断,这个问题现在可能正在发生,因为您尝试连接的服务已经升级了他们的 OpenSSL 版本,现在拒绝您的证书。

如果您像我一样,尝试在您的 raspberrypi 上通过加密的 HTTPS 连接设置 Flask 端点服务器并遇到与 OP 相同的错误,则默认提供的 python 库(Flask 和 pyOpenSSL) raspbian OS 太旧了

写这篇文章的时候,我使用的是Raspbian9(stretch),python3.8,默认库版本是Flask==0.12.1,pyOpenSSL==16.2.0

我通过安装最新的 Flask==1.1.1 和 pyOpenSSL==19.1.0

修复了我作为 OP 遇到的相同错误

不确定我的回答是否有帮助,但只是把它扔在那里..

用openssl重新生成CA文件,hash更强(比如sha256)这样唱:

    openssl genrsa -out private/cakey.pem  3072
    openssl req -new -sha256 -key private/cakey.pem -out private/ca.csr -subj "/C=CN/ST=envoy-test/L=envoy-test/O=envoy-test/OU=envoy-test/CN=envoy-test"
    openssl x509 -req -days 3650 -sha256 -extensions v3_ca -signkey private/cakey.pem -in private/ca.csr -out certs/ca.cer

如果你不明白后果,请不要这样做。

如果您无法重新生成 ca 证书,您可以先要求管理员更改证书,作为最后的选择,您可以更改 openssl 配置以降低 ciphers 安全级别, SECLEVEL=2(或任何数字)到 SECLEVEL=0,在 debian/linux 中执行此操作:

  • 寻找 openssl conf:openssl version -d。示例:/usr/lib/ssl
  • 然后 sed -i -e 's/SECLEVEL=2/SECLEVEL=0/g' /usr/lib/ssl/openssl.cnf(更改结果的路径和编号)。

要小心,因为在level = 0

Everything is permitted. This retains compatibility with previous versions of OpenSSL.

好像有些版本没有SECLEVEL,这种情况你可以把DOPENSSL_TLS_SECURITY_LEVEL=n改成DOPENSSL_TLS_SECURITY_LEVEL=0,如果没有就加上source