忽略SSL自签名证书验证需谨慎:requests设verify=False并禁用警告;curl用-k;Java需重写SSLContext和TrustManager;Node.js用https.Agent的rejectUnauthorized: false;均不解决国密算法或mTLS等特殊场景,且跳过验证会丧失安全防护。
requests 忽略 SSL 自签名证书验证
直接设 verify=false 就能跳过证书校验,但会触发 insecurerequestwarning 警告,且不推荐用于生产环境。
- 必须显式关闭警告,否则控制台刷屏:
import requests from requests.packages.urllib3.exceptions import InsecureRequestWarning requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
-
verify=False只影响 TLS 握手阶段的证书链验证,不绕过域名匹配(即仍要求证书里的 CN 或 SAN 匹配请求 host);若连域名也不匹配,需配合certifi替换或改用urllib3底层配置 - 某些旧版 Python(如 2.7.9 以下)或系统 OpenSSL 版本太低时,
verify=False可能无效,得降级到urllib3==1.25.11并手动 patch 连接池
curl 命令行跳过自签证书检查
加 -k(等价于 --insecure)最简单,但要注意它同时忽略证书有效性、域名不匹配和过期问题。
- 不要和
--cacert混用:两者冲突,-k优先级更高,后者会被无视 - 如果服务端用了客户端证书双向认证(mTLS),
-k不影响客户端证书发送,仍需配--cert和--key - 脚本中用
-k时建议加注释说明风险,避免被误当“通用调试开关”长期保留
Java HttpClient 忽略自签证书(OpenJDK 11+)
不能只靠 setHostnameVerifier,必须重写 SSLContext 并注入信任所有证书的 TrustManager。
- 关键点是调用
SSLContext.getInstance("TLS")后,用自定义X509TrustManager初始化,再传给HttpsURLConnection.setDefaultSSLSocketFactory() - 别漏掉
setHostnameVerifier((hostname, session) -> true),否则即使证书可信,域名不匹配仍会报java.security.cert.CertificateException: No subject alternative names present - 这种写法在 JDK 17+ 的默认安全策略下可能被拒绝,需启动时加
--illegal-access=permit或改用HttpClient.newBuilder().sslContext(...)新 API
Node.js axios 忽略证书校验
通过 httpsAgent 配置 rejectUnauthorized: false 实现,但注意这个选项只对 HTTPS 请求生效,HTTP 请求不受影响。
- 必须用
https.Agent,不是http.Agent;写错会导致请求卡住或报Error: socket hang up - 若服务器证书使用了国密 SM2/SM4 算法,Node.js 原生不支持,
rejectUnauthorized: false也救不了——得换支持国密的运行时(如 Node.js + gm-crypto 插件) - 在 Electron 环境中,还需额外调用
session.defaultSession.setCertificateVerifyProc(),否则主进程发起的请求仍会校验
真正麻烦的从来不是关掉校验,而是关掉之后怎么确保通信没被中间人篡改。自签名证书本身不提供信任链,跳过验证等于把加密层当摆设用,该加 pinning 的地方不能省。











