SSL: CERTIFICATE_VERIFY_FAILED证书验证失败

4
from lxml import html
import requests


url = "https://website.com/"
page = requests.get(url)
tree = html.fromstring(page.content)
page.content

-> SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:748)

我运行这个脚本时出现了这个错误。我该怎么办?


可能是重复的问题,请参考此处以获取解决方案:https://dev59.com/t14c5IYBdhLWcg3wgqn2。 - ivan7707
3
如果您能说明"website.com"是真实的URL还是仅为示例,并且您已经采取了哪些步骤来确保其证书受信任,那么提供建议将更加容易。您可能需要启用一些SSL跟踪。 - Kevin Boone
这是一个公司内部网址。 - Leo
2
可能是urllib和“SSL:CERTIFICATE_VERIFY_FAILED”错误的重复问题。 - Mureinik
1个回答

12

由于您的URL是“内部企业URL”(如评论中所述),我猜测它使用了自签名证书或由自签名CA证书颁发。

如果确实是这种情况,您有两个选择:

(1) 将公司CA的路径(包括任何中间证书的完整链)提供给requests.get()调用通过verify参数:

requests.get('https://website.lo', verify='/path/to/certfile')

或者(2),彻底禁用客户端证书验证(但请注意所有涉及的安全风险,例如简单的中间人攻击等):

requests.get('https://website.lo', verify=False)

为了完整起见,相关的verify参数在requests.request()文档中进行了描述:

verify -- (optional) Either a boolean, in which case it controls whether we verify 
          the server's TLS certificate, or a string, in which case it must be a path 
          to a CA bundle to use. Defaults to True.

我在哪里可以找到我的证书文件? - Leo
requests默认情况下会尝试使用certifi捆绑包,但如果您要求内部企业服务器的CA证书,则最好向网络管理员请求提供其证书。 - randomir
我今天一直在为一个变体的 OP 错误苦苦挣扎。我不知道自己需要的答案是:_requests.get('https://website.lo', verify=False)_。我的 Python 已经非常生疏了,我试图将 verify=False 插入到另一行中,但它根本没有起作用。谢谢! - Cerberus136
@Cerberus136,请注意,将verify设置为false实际上完全放弃了SSL层提供的安全性。也就是说,中间人攻击变得非常容易,因为证书可以在飞行中被欺骗,而您的客户端永远不会意识到这一点。 - randomir

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