为什么requests.get()设置verify=True时访问无SSL证书站点不报错
问题原因
verify参数仅对HTTPS协议的请求生效,你当前请求的URL是http://开头的HTTP协议地址,整个请求过程不会触发SSL/TLS握手流程,verify=True的配置不会生效,自然不会抛出证书相关错误。- 补充说明:如果站点配置了HTTP强制跳转到HTTPS,requests默认跟随重定向的情况下,跳转后的HTTPS请求会生效
verify配置,但这种方式不可靠,部分未配置跳转的HTTP站点不会触发证书校验逻辑。
解决方法
要检测站点是否有有效SSL证书,直接构造HTTPS协议的请求,捕获证书相关异常即可,参考代码如下:
import requests from requests.exceptions import SSLError, ConnectionError def check_ssl_cert(domain): # 主动构造HTTPS请求 url = f"https://{domain}" try: requests.get(url, verify=True, timeout=5) return True, "站点具备有效SSL证书" except SSLError: return False, "站点SSL证书无效或不存在" except ConnectionError: return False, "站点无法通过HTTPS协议访问,未部署SSL证书或服务不可用" except Exception as e: return False, f"检测出错:{str(e)}" # 测试示例,直接传域名即可,不需要加http前缀 print(check_ssl_cert("dtdev.atwebpages.com"))
如果需要兼容带HTTP/HTTPS前缀的输入URL,可以先对输入内容做预处理,提取出纯域名后再构造HTTPS请求校验,避免协议头影响校验结果。
内容的提问来源于stack exchange,提问作者Destrexx
相关产品推荐
相关产品推荐

