https屏蔽ssl证书认证是怎么回事?如何配置https ssl证书
- 云服务器
- 2026-07-10
- 9
在开发或运维过程中,遇到 SSL certificate verification failed 或 HTTPS certificate verify failed 错误是非常常见的现象,这通常意味着客户端(如 Python 的 requests 库、curl 命令、Node.js 等)在尝试建立 HTTPS 连接时,无法验证服务器提供的 SSL/TLS 证书的有效性。
虽然从安全最佳实践的角度来看,永远不应在生产环境中禁用 SSL 证书验证,但在本地开发、测试环境或内部网络中,为了调试方便,有时需要临时绕过这一检查。
以下是关于如何屏蔽 SSL 证书认证的详细指南,涵盖多种常见场景和工具。
为什么会出现 SSL 证书验证失败?
在深入解决方案之前,了解原因有助于选择正确的处理方式:

- 自签名证书:服务器使用的是自己生成的证书,而非由受信任的证书颁发机构(CA)签发。
- 证书过期:服务器证书已超过有效期。
- 域名不匹配:证书绑定的域名与实际访问的域名不一致。
- 中间人代理:公司内网使用了 SSL 拦截代理(如 Fiddler、Charles、企业防火墙),导致客户端看到的是代理的证书而非服务器的真实证书。
- 系统 CA 证书缺失:客户端操作系统或运行环境缺少必要的根证书。
常见编程语言的屏蔽方法
Python (requests 库)
requests 是最常用的 HTTP 库之一,默认情况下,它会验证 SSL 证书。
方法 A:临时禁用验证(不推荐用于生产环境)
import requests # 设置 verify=False 来禁用 SSL 证书验证 response = requests.get('https://your-internal-api.com', verify=False) print(response.status_code)
注意:使用 verify=False 时,控制台通常会发出 InsecureRequestWarning 警告,可以通过以下方式抑制警告:
方法 B:指定自定义 CA 证书(推荐)
如果服务器使用的是自签名证书,更安全的做法是指定该证书的路径,而不是完全禁用验证。
import requests # 指定包含自签名证书的 .pem 文件路径 response = requests.get('https://your-internal-api.com', verify='/path/to/ca-bundle.crt')
Python (urllib / http.client)
import urllib.request import ssl # 创建一个不验证 SSL 上下文的对象 context = ssl._create_unverified_context() # 在请求中使用该上下文 req = urllib.request.Request('https://your-internal-api.com') response = urllib.request.urlopen(req, context=context)
Node.js (Axios)
const axios = require('axios'); // 方法 A:禁用验证 axios.get('https://your-internal-api.com', { httpsAgent: new (require('https').Agent)({ rejectUnauthorized: false }) }).then(response => { console.log(response.data); }); // 方法 B:指定自定义 CA 证书 const fs = require('fs'); const caCert = fs.readFileSync('/path/to/ca-bundle.crt'); axios.get('https://your-internal-api.com', { httpsAgent: new (require('https').Agent)({ ca: caCert }) });
Node.js (原生 fetch)
// Node.js 17+ 原生支持 fetch('https://your-internal-api.com', { agent: new (require('https').Agent)({ rejectUnauthorized: false }) });
Java (OkHttp / HttpClient)
OkHttp:
OkHttpClient client = new OkHttpClient.Builder() .sslSocketFactory(new TrustAllSslSocketFactory(), new TrustAllTrustManager()) .hostnameVerifier((hostname, session) -> true) .build();
Java 11+ HttpClient:
HttpClient client = HttpClient.newBuilder() .sslContext(SSLContext.getInstance("TLS")) // 需要自定义 TrustManager 来信任所有证书 .build();
命令行工具屏蔽方法
cURL
# 使用 -k 或 --insecure 标志 curl -k https://your-internal-api.com # 或者 curl --insecure https://your-internal-api.com
Wget
# 使用 --no-check-certificate 标志 wget --no-check-certificate https://your-internal-api.com
Postman
- 打开 Postman。
- 进入 Settings (齿轮图标)。
- 找到 General 选项卡。
- 取消勾选 SSL certificate verification。
环境变量全局屏蔽
某些工具支持通过环境变量全局禁用 SSL 验证。
工具/语言 环境变量 说明 Python (requests) REQUESTS_CA_BUNDLE 或 CURL_CA_BUNDLE 设置为空字符串或无效路径可能触发验证失败,但通常用于指定 CA 文件,完全禁用需代码控制。 Node.js NODE_TLS_REJECT_UNAUTHORIZED=0 在运行脚本前设置:export NODE_TLS_REJECT_UNAUTHORIZED=0 Git GIT_SSL_NO_VERIFY=true 用于解决 Git clone/pull 时的 SSL 错误。 npm NODE_TLS_REJECT_UNAUTHORIZED=0 同上,影响 npm 包安装。
重要提示:设置 NODE_TLS_REJECT_UNAUTHORIZED=0 会影响当前 shell 会话中所有使用 Node.js 的网络请求,包括 npm、yarn 等,存在安全风险,请谨慎使用。
最佳实践与安全建议
尽管上述方法可以解决问题,但请务必牢记以下原则:
- 仅用于开发/测试:永远不要在生产环境中禁用 SSL 证书验证,这会使你的应用容易受到中间人攻破(MITM)。
- 使用内部 CA:如果团队内部使用自签名证书,应建立内部 CA,并将根证书安装到所有客户端的信任库中。
- 使用正确的证书:确保服务器证书未过期,且域名匹配。
- 更新 CA 证书包:有时问题仅仅是因为客户端的 CA 证书包过旧,运行 apt-get update && apt-get install ca-certificates (Ubuntu/Debian) 或 yum update ca-certificates (CentOS/RHEL) 可能解决问题。
相关问题与解答
问题 1:禁用 SSL 证书验证后,是否还能防止中间人攻破?
解答:
不能。 禁用 SSL 证书验证(如设置 verify=False 或 rejectUnauthorized: false)意味着客户端不再验证服务器身份,攻破者可以轻易地拦截通信,替换服务器证书,并解密或改动传输的数据,HTTPS 提供的机密性和完整性保护完全失效,连接退化为类似 HTTP 的状态,只是加密密钥交换过程可能仍在使用,但缺乏身份认证,这仅应在受信任的封闭测试环境中使用。
问题 2:如何在 Python 中既保留 SSL 验证,又解决因公司代理导致的证书错误?
解答:
如果错误是由公司 SSL 拦截代理引起的,最佳解决方案不是禁用验证,而是将公司的根证书添加到 Python 的信任列表中。
- 从 IT 部门获取公司的根 CA 证书(通常为 .crt 或 .pem 格式)。
- 将该证书文件保存到本地,company-ca.crt。
- 在代码中指定该证书路径: import requests response = requests.get('https://internal-site.com', verify='/path/to/company-ca.crt')
- 或者,将该证书添加到系统的 CA 信任库中,这样所有使用该系统的程序(包括 Python)都会自动信任它,在 Linux 上,可以将证书复制到 /usr/local/share/ca-certificates/ 并运行 update-ca-certificates。

