如何找到 SSL 证书文件的路径?

15
我想使用Python的Requests库获取内部公司网页(比如说,https://internal.com)。我可以在浏览器中看到这个页面并且可以“查看证书”。因此,现在我想用Requests获取网页内容,我会这样做:
import requests
requests.get('https://internal.com')

但是我收到了一个 SSLError 错误:

SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

所以我想我需要指定一个证书文件:

requests.get('https://example.com', cert=('/path/server.crt', '/path/key'))

但是我如何找到证书文件的路径?我能从Chrome或IE中查看网页时获取这些信息吗?还是我漏掉了更基本的东西?


什么是确切的错误? - Burhan Khalid
@brent5000:你尝试过伪造用户代理吗? - Blender
通过修改 headers['User-Agent'] 中的用户代理来欺骗服务器返回相同的 SSLError(已添加到问题中)。 - brent5000
2个回答

11

cert参数用于客户端身份验证。如果您希望向服务器证明自己的身份,则需要使用此参数。如果这是问题所在,您将在服务器上收到错误信息。

你需要的是服务器端身份验证。服务器必须证明它的身份。 因为你正在连接到一个内部服务器,requests没有这个服务器证书在其提供的bundle中,因此无法确认服务器的身份。 您必须向requests提供您的内部CA-bundle。 要做到这一点,您必须首先从浏览器中提取它。

来自文档:

You can also pass "verify" the path to a "CA_BUNDLE" file for private certs.
You can also set the "REQUESTS_CA_BUNDLE" environment variable.
  • 在网址栏输入chrome://settings/certificates
  • 选择“机构”选项卡
  • 找到你的内部CA并点击导出
  • 最佳格式是“Base64编码证书链”
  • 保存到一个容易找到的位置
  • 现在可以使用`request.get(url, verify=)
  • 您也可以通过以下方式访问证书管理器:
  • 转至设置
  • 在底部单击“显示高级设置”
  • HTTPS/SSL ->“管理证书”
  • 参见上文

1
谢谢,我能够按照这些说明导出证书。然而,当我将 .cer 文件传递给 requests.get('https://...', verify='/path/to/.ces') 时,我收到了以下错误:[Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed。看起来 requests 不喜欢我的特定证书,但是你回答了我的问题,非常感谢。 - brent5000
@brent5000 另一种方法是通过单击 URL 栏旁边的 SSL 按钮来实现。这样可以查看当前站点的证书链。然后导出顶部的证书并重试。 - t-8ch
如果在Chrome浏览器上无法运行,会发生什么情况?我尝试了@t-8ch建议的方法,使用Firefox却无法导出证书。 - gerl
没有“Base64编码的证书链”或任何其他链导出选项。我只有“Base-64编码的X.509(.CER)”。这是否意味着我无法导出整个链? - cowlinator

0
确保在导出证书时,在文件类型另存为下拉菜单中选择“带链式导出” - 这样它将包含三个证书。这就是我的问题所在。

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