当前位置:首页 > 云服务器 > 正文

https屏蔽ssl证书认证是怎么回事?如何配置https ssl证书

在开发或运维过程中,遇到 SSL certificate verification failed 或 HTTPS certificate verify failed 错误是非常常见的现象,这通常意味着客户端(如 Python 的 requests 库、curl 命令、Node.js 等)在尝试建立 HTTPS 连接时,无法验证服务器提供的 SSL/TLS 证书的有效性。

虽然从安全最佳实践的角度来看,永远不应在生产环境中禁用 SSL 证书验证,但在本地开发、测试环境或内部网络中,为了调试方便,有时需要临时绕过这一检查。

以下是关于如何屏蔽 SSL 证书认证的详细指南,涵盖多种常见场景和工具。

为什么会出现 SSL 证书验证失败?

在深入解决方案之前,了解原因有助于选择正确的处理方式:

https屏蔽ssl证书认证是怎么回事?如何配置https ssl证书 第1张

  • 自签名证书:服务器使用的是自己生成的证书,而非由受信任的证书颁发机构(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 警告,可以通过以下方式抑制警告:

https屏蔽ssl证书认证是怎么回事?如何配置https ssl证书 第2张

方法 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:

https屏蔽ssl证书认证是怎么回事?如何配置https ssl证书 第3张

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

  1. 打开 Postman。
  2. 进入 Settings (齿轮图标)。
  3. 找到 General 选项卡。
  4. 取消勾选 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 等,存在安全风险,请谨慎使用。


最佳实践与安全建议

尽管上述方法可以解决问题,但请务必牢记以下原则:

  1. 仅用于开发/测试:永远不要在生产环境中禁用 SSL 证书验证,这会使你的应用容易受到中间人攻破(MITM)。
  2. 使用内部 CA:如果团队内部使用自签名证书,应建立内部 CA,并将根证书安装到所有客户端的信任库中。
  3. 使用正确的证书:确保服务器证书未过期,且域名匹配。
  4. 更新 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 的信任列表中。

  1. 从 IT 部门获取公司的根 CA 证书(通常为 .crt 或 .pem 格式)。
  2. 将该证书文件保存到本地,company-ca.crt。
  3. 在代码中指定该证书路径: import requests response = requests.get('https://internal-site.com', verify='/path/to/company-ca.crt')
  4. 或者,将该证书添加到系统的 CA 信任库中,这样所有使用该系统的程序(包括 Python)都会自动信任它,在 Linux 上,可以将证书复制到 /usr/local/share/ca-certificates/ 并运行 update-ca-certificates。

0