【问题标题】:How to fix SSL issue SSL_CTX_use_certificate : ca md too weak on Python Zeep如何修复 SSL 问题 SSL_CTX_use_certificate:ca md 在 Python Zeep 上太弱
【发布时间】:2018-09-07 08:52:27
【问题描述】:

我的代码之前一直在工作,直到每当我向 Frontierlink Web Service 发出 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

提前谢谢你!

【问题讨论】:

  • 问题是新版本的 OpenSSL 不接受 md5 签名证书。不是真正的编码问题,您只需要使用更强的(SHA1 等)签名重新生成证书。
  • 感谢您的意见@Serdalis,我一直在寻找解决方案,但我没有机会解决此问题。是否有可能我更新了我的 openssl 版本,这就是它突然不起作用的原因?
  • 为了进一步说明是在我使用的 OpenSSL 版本上还是在我正在请求的 Web 服务上? @Serdalis 再次感谢,感谢您对此的帮助。
  • 老实说,这不是我以前遇到过的,但它会是您在本地使用的 openSSL 版本。如果你或者你的服务升级到1.1.0会出现这个问题,虽然从mta.openssl.org/pipermail/openssl-users/2017-October/…判断,另一端的服务也会抛出这个错误,从你链接的版本来看,这似乎是问题所在。跨度>
  • 好的@Serdalis 很感激,至少我知道如何解决这个问题。再次感谢。您可以在这里发布您的解决方案,以便我可以为您的解决方案投票。

标签: python openssl zeep


【解决方案1】:

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

OpenSSL 1.1.0 引入了一个名为 security level 的新功能。
1 的默认设置将导致以下情况(我强调):

安全级别对应于至少 80 位的安全性。不包括任何提供低于 80 位安全性的参数。因此,禁止使用小于 1024 位的 RSA、DSA 和 DH 密钥以及小于 160 位的 ECC 密钥。禁止所有导出密码套件,因为它们都提供少于 80 位的安全性。禁止使用 SSL 版本 2。 任何对 MAC 使用 MD5 的密码套件也被禁止

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

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

【讨论】:

  • 抱歉不能投票,因为我的声望太低了。无论如何,感谢您对此的意见。
  • @JmDollosa 不用担心,如果您自己能够更好地解决这个问题,请随时回来并放下您所做的并接受它作为答案,而不是帮助其他可能出现的人。
  • 这是不精确的; 1.1.0(和 1.1.1)并没有完全禁止 MD5,而是(新)支持整体安全级别的概念,并且 default 安全级别 1 禁止 MD5 签名证书。一般来说,应用程序可以更改级别,级别 0 仍然接受 MD5(尽管这通常是不明智的),而级别 2 也禁止 SHA1 签名。我不知道 Python; dian jin 的较新答案表明至少存在一些可能性。
  • @dave_thompson_085 感谢您提供的信息,这很有意义。我会将我能找到的内容添加到我的答案中,以便更准确。
【解决方案2】:

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

在撰写本文时,我使用的是 Raspbian 9 (stretch),python 3.8,默认库版本为 Flask==0.12.1,pyOpenSSL==16.2.0

我通过安装最新的 Flask==1.1.1 和 pyOpenSSL==19.1.0 修复了我遇到的与 OP 相同的错误

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

【讨论】:

    【解决方案3】:

    使用具有更强哈希(例如 sha256 )的 openssl 重新生成 CA 文件,如下所示:

        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
    

    【讨论】:

      【解决方案4】:

      如果您不了解后果,请不要这样做。

      如果您无法重新生成 ca 证书,您可以先要求管理员更改证书,作为最后的选择,您可以更改 openssl 配置以降低 ciphers 安全级别、SECLEVEL=2(或任何number) 到 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

      一切都是允许的。这保留了与以前版本的 OpenSSL 的兼容性。

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

      【讨论】:

        猜你喜欢
        • 2019-12-18
        • 2022-12-16
        • 1970-01-01
        • 2020-07-03
        • 2011-05-25
        • 1970-01-01
        • 2022-06-13
        • 2019-10-27
        • 1970-01-01
        相关资源
        最近更新 更多