Wget 和 Python 请求无法验证 SSL 证书,但浏览器不显示任何警告

信息安全 tls 证书
2021-08-31 17:56:39

我试图 wget 一个网站,它回来说:

错误:“website.com”的证书不受信任。错误:“website.com”的证书没有已知的颁发者。

从一台机器,从另一台机器

错误:无法验证 website.com 的证书,由 'CN=GlobalSign 组织验证 CA - SHA256 - G2,O=GlobalSign nv-sa,C=BE' 颁发:无法在本地验证颁发者的权限。要不安全地连接到 website.com,请使用 `--no-check-certificate'。

作为附加检查,我使用 Python 的请求库来查看它会说什么:

requests.exceptions.SSLError: ("糟糕的握手: 错误([('SSL 例程', 'tls_process_server_certificate', '证书验证失败')],)",)

但是,当网站在 Firefox 和 Chrome 中加载时,网站的证书都没有任何问题。他们不应该就网站 SSL 证书的任何问题向我发出警告吗?

2个回答

由于没有足够的信息来重现它,因此尚不完全清楚您的问题到底是什么。但是,假设您使用的是支持 SNI 的最新版本的 wget an requests,我想它是

  • 服务器证书由浏览器信任但不受系统 CA 存储信任的 CA 颁发。Chrome 和 Firefox 使用与 wget 或 requests 不同的 CA 存储。例如,如果服务器证书(由客户端接收)是由非公共 CA 颁发的,这可能会发生,这在访问 Intranet 站点时通常是这种情况,或者如果使用 SSL 拦截的防火墙。特别是在 Windows 系统上,wget 和请求的证书存储也可能是空的,因为系统 CA 存储与 OpenSSL 不兼容。
  • 或者站点配置错误,服务器没有发送必要的中间证书。桌面浏览器通常可以解决这个问题,而其他程序则不能。对照SSLLabs检查此站点并查找链问题。

您可以尝试安装certifi,然后使用requests吗?这将使用与 Mozilla 相同的根证书,因此您应该会看到与浏览器相同的行为。