如何避免在libmproxy中出现“tlsv1 alert unknown ca”错误?

22

目前使用libmproxy,它又使用telnetlib来向HTTPS网页发出请求。 然而,会引发以下错误:

Error: [('SSL routines', 'SSL3_READ_BYTES', 'tlsv1 alert unknown ca')]

我认为这与无法验证为页面使用的证书背书的CA的身份有关。我认为应该有一个设置,我可以打开(或关闭),允许绕过验证 - 我不想验证数字签名者的身份。

我认为一个可能的,有点丑陋的解决方案是修补代码以捕获异常并忽略它,但我更希望有一种更干净、更受支持的方法来解决这个问题。

有没有好的方法可以避免/解决这个问题呢?

非常感谢!


2
你是否意识到绕过验证会使连接容易受到潜在的中间人攻击? - Bruno
1
是的。这是一个固有不安全的环境,进入可能存在不安全情况是“可以”的。不过还是谢谢你提醒 :) - Juan Carlos Coto
1
我试图深入研究这个问题,但它并不是一个“在Python中”的问题 - 答案将特定于底层库。看起来libmproxy使用netlib,而netlib使用openssl库,所以我必须首先查看openssl库并找出如何在那里关闭验证,然后查看netlib是否有一种方法来激活它,然后查看libmproxy是否有一种方法来激活使netlib执行使openssl不验证证书的操作。 - James Polley
2
我尝试了来自http://mitmproxy.org/doc/scripting/libmproxy.html的示例,并成功加载了一个没有受信任CA的网站。你能发布一些关于如何使用lib的代码吗?或者是导致问题的示例链接?你有客户端CA文件吗? - springrider
1
你看过配置选项了吗?也许尝试设置no_upstream_cert=True?默认值为:Config(certfile=None, cacert=None, clientcerts=None, no_upstream_cert=False, body_size_limit=None, reverse_proxy=None, forward_proxy=None, transparent_proxy=None, authenticator=None) - Cypress Frankenfeld
@springrider,我认为我们没有客户端CA文件。 @CypressFrankenfeld,我看到你已经将“no_upstream_cert”设置为True和False,所以我有点困惑。如果你愿意,你可以把这个作为一个答案,我会看一下的。 - Juan Carlos Coto
2个回答

3

如果你使用的是Windows客户端,似乎可以使用certutil。

http://support.microsoft.com/kb/555252

如果你使用的是Linux客户端,可以使用以下命令:

sudo mkdir /etc/share/certificates/extra && cp cacert.crt /user/share/certficates/extra/cacert.crt
sudo dpkg-reconfigure ca-certificates

对于Mac客户端:

sudo security add-trusted-cert -d -r trustRoot -k \
"/Library/Keychains/System.keychain" \
"/private/tmp/certs/certname.cer"

我从https://apple.stackexchange.com/questions/80623/import-certificates-into-system-keychain-via-the-command-line中得到了这个答案。

此外,阅读libmproxy的网页,似乎它能够加载自定义证书。如果你已经有一个内部证书授权机构,而且你的客户端已经信任它,那么你可能只需要从那里生成证书。


2
当向用户呈现的proxySG证书没有被受信任的CA签名时,就会出现这种情况。
我也曾遇到过这个错误,我通过通过组策略将CA(用于ssl代理的CA)推送到实际的浏览器中来修复它。

听起来值得一探究竟。你能详细说明如何做以及那些术语的含义吗? - Juan Carlos Coto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接