【发布时间】:2021-12-05 00:40:30
【问题描述】:
我正在编写一段代码来验证给定 URL 的 SSL 证书是否有效,但是,请求库似乎无法正常工作。代码如下:
import requests
try:
response = str(requests.get(url, verify=True, allow_redirects=True))
print(response)
if "SSL: CERTIFICATE_VERIFY_FAILED" in response:
print("url \"" + url + "\" has an invalid SSL certificate")
else:
valid = True
for command in commands:
if command.title == "get info":
if command.expirationDate > datetime.date:
print("url has an expired SSL certificate.")
valid = False
if valid:
print("url \"" + url + "\" has a valid SSL certificate")
except requests.exceptions.InvalidURL:
print("Invalid url \"" + url + "\"")
except requests.exceptions.MissingSchema:
print("Invalid url \"" + url + "\"")
except (socket.gaierror, urllib3.exceptions.NewConnectionError, urllib3.exceptions.MaxRetryError, requests.exceptions.ConnectionError):
print("Could not resolve url \"" + url + "\" to host")
输入网址“https://expired.badssl.com/”返回
Could not resolve url "https://expired.badssl.com/" to host
但是,我实际上可以导航到此页面。
此外,没有有效证书的页面显示为有效。我的一个朋友在他的牛肉 xss 服务器上运行了这个确切的代码,输出是它有一个有效的证书。我看过很多教程都说了同样的话,但是,鉴于我没有尝试过任何工作,我一定会遗漏一些东西。
【问题讨论】:
-
如果证书验证失败,为什么你认为
SSL: CERTIFICATE_VERIFY_FAILED会被requests.get()返回? -
根据 Geeks for Geeks 的说法,当您打印出响应时,如果验证失败,输出字符串将包含该响应。不确定这是否是最佳做法,但这是我能找到的最佳方法。
-
...根据 Geeks for Geeks... 请提供该声明的链接。
-
啊,我明白你的困惑了。正如下面的答案所指出的,该字符串不是由对
requests.get()的调用返回,它是调用引发的异常的一部分。如果您不熟悉异常,则它们很奇怪,您应该阅读有关它们的教程。有几个,here is one。
标签: python ssl python-requests