SSL/TLS 报错速查
把看到的报错原文贴进搜索框,找到对应页面,就能看到原因、访客自查方法和服务器端的修法。
每一页对应一条报错原文,比如 NET::ERR_CERT_DATE_INVALID、SEC_ERROR_UNKNOWN_ISSUER,或者 360 浏览器、QQ 浏览器里的中文提示。搜你看到的那行字,打开对应页面,按顺序排查。
怎么用这些页面
第一步先查网站,而不是先折腾自己的电脑。 把域名填进 SSL 检测,或者在任意终端里运行:
curl ssl.sh/example.com
检测会从我们的服务器、用最新的根证书库去连接网站,列出证书、证书链、支持的协议版本和常见配置错误。结果出来,问题就分成两条路:
- 检测也报错:网站配置有问题,比如证书过期、缺中间证书、域名对不上、TLS 版本太老。你是站长,就照着报错页里“站长怎么修”一节改;你只是访客,自己这边没有安全的修法,联系网站方等他们处理。
- 检测正常,但你的浏览器还是报错:问题在你的设备或网络上,常见的是系统时间、杀毒软件(如 360、火绒、卡巴斯基)的 HTTPS 扫描、公司上网行为管理设备、公共 Wi-Fi 认证页,或者系统太旧。每一页的“先判断是网站的问题还是你电脑的问题”一节会告诉你先查什么。
每一页里有什么
每个报错页按可能性从高到低列出原因,给出同一个错误在 Chrome、Edge、Firefox、Safari、360 浏览器、QQ 浏览器和手机上的样子,并附上 Nginx、Apache、宝塔面板、阿里云/腾讯云 CDN 的配置改法。需要的时候会链接到 证书链工具、证书解析、TLS 配置生成器 等工具。
我们不会建议你在别人的网站上点“继续访问”。绕过证书警告,等于主动放弃了防止连接被窃听和篡改的那道保护。
浏览器
您的连接不是私密连接
Chrome、Edge、360 浏览器提示“您的连接不是私密连接”,说明证书校验失败。页面下方的 NET:: 代码指出具体原因,按代码就能找到对应修法。
NET::ERR_CERT_DATE_INVALID
Chrome 提示 NET::ERR_CERT_DATE_INVALID,说明证书已过期或还没生效。先查网站证书,再查电脑时间,站长续期后要重载服务。
NET::ERR_CERT_AUTHORITY_INVALID
NET::ERR_CERT_AUTHORITY_INVALID 表示 Chrome 不信任证书的签发者:自签名、私有 CA、证书链不全,或被杀软/代理拦截。
NET::ERR_CERT_COMMON_NAME_INVALID
NET::ERR_CERT_COMMON_NAME_INVALID 表示证书里没有你访问的域名。常见是缺 www、子域名没签进去或 SNI 配错。
ERR_SSL_PROTOCOL_ERROR
ERR_SSL_PROTOCOL_ERROR 表示 TLS 握手在校验证书之前就失败了。多数是服务器端口或 TLS 配置问题,少数是代理和杀软干扰。
ERR_SSL_VERSION_OR_CIPHER_MISMATCH
ERR_SSL_VERSION_OR_CIPHER_MISMATCH 表示浏览器和服务器没有共同的 TLS 版本或加密套件。多见于只支持 TLS 1.0 的老服务器或 CDN 没配证书。
NET::ERR_CERT_REVOKED
NET::ERR_CERT_REVOKED 表示网站证书在到期前已被 CA 吊销,Chrome 不提供“继续前往”。这页列出吊销的 5 种原因、访客该怎么办,以及站长如何重签并替换所有副本。
警告:面临潜在的安全风险
Firefox 提示“警告:面临潜在的安全风险”说明证书校验失败。点“高级”能看到具体错误代码,按代码找原因和修法。
SEC_ERROR_UNKNOWN_ISSUER
SEC_ERROR_UNKNOWN_ISSUER 表示 Firefox 无法把证书追溯到受信任的根:缺中间证书、私有 CA,或者 HTTPS 被拦截。
SSL_ERROR_BAD_CERT_DOMAIN
Firefox 提示 SSL_ERROR_BAD_CERT_DOMAIN,说明证书里没有你访问的域名。修 SAN 列表、SNI 配置或 CDN 证书绑定即可。
SEC_ERROR_EXPIRED_CERTIFICATE
Firefox 提示 SEC_ERROR_EXPIRED_CERTIFICATE,要么证书真的过期了,要么电脑时间快了。怎么从警告页的日期分辨两者,以及站长续期后怎样重载生效。
MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT
Firefox 提示 MOZILLA_PKIX_ERROR_SELF_SIGNED_CERT,说明证书是网站自己签发的。这页说明路由器、NAS 上什么时候可以接受,公开网站出现时访客和站长该怎么处理。
缺少中间证书
证书链不完整时 Chrome 能打开,curl、安卓 App、Java、Python 却报错。教你检测缺失的中间证书并配置完整证书链。
混合内容警告
控制台提示 Mixed Content,说明 HTTPS 页面加载了 HTTP 资源。教你定位这些资源,以及 WordPress、宝塔、CDN 下的修法。
NET::ERR_CERT_INVALID
NET::ERR_CERT_INVALID 表示 Chrome 认为证书本身有问题:编码错误、扩展不合规或违反规则,多见于自己生成的证书。
NET::ERR_SSL_OBSOLETE_VERSION
NET::ERR_SSL_OBSOLETE_VERSION 表示服务器只支持 TLS 1.0 或 1.1。浏览器已全部淘汰这两个版本,服务器必须开启 TLS 1.2/1.3。
SSL_ERROR_UNSUPPORTED_VERSION
Firefox 提示 SSL_ERROR_UNSUPPORTED_VERSION,说明网站不支持 TLS 1.2 及以上。为什么不建议重新开启 TLS 1.0,以及服务器怎么改。
ERR_SSL_UNRECOGNIZED_NAME_ALERT
ERR_SSL_UNRECOGNIZED_NAME_ALERT 表示服务器拒绝了 SNI 里的域名。检查 DNS 解析、虚拟主机、CDN 加速域名或 ssl_reject_handshake 配置。
SSL_ERROR_NO_CYPHER_OVERLAP
SSL_ERROR_NO_CYPHER_OVERLAP 表示 Firefox 和服务器没有共同支持的加密套件。多是服务器套件列表过时,或 Firefox 设置被改过。
PR_END_OF_FILE_ERROR
Firefox 报 PR_END_OF_FILE_ERROR 时,怎么判断断开连接的是本机代理、安全软件、被改过的 TLS 首选项还是服务器,以及站长侧的排查步骤。
SSL_ERROR_RX_RECORD_TOO_LONG
Firefox 提示 SSL_ERROR_RX_RECORD_TOO_LONG,说明服务器用明文 HTTP 回应了 HTTPS 请求。多是 listen 443 没写 ssl,或把 HTTPS 发到了 HTTP 端口。
SEC_ERROR_INADEQUATE_KEY_USAGE
SEC_ERROR_INADEQUATE_KEY_USAGE 表示证书的密钥用途不允许当前操作。多见于自制证书、设备证书和 Firefox 里残留的证书数据。
SEC_ERROR_OCSP_* 系列报错
Firefox 的 SEC_ERROR_OCSP_INVALID_SIGNING_CERT、SEC_ERROR_OCSP_OLD_RESPONSE 等错误,表示吊销状态响应不可用。原因和修法汇总。
REQUIRED_TLS_FEATURE_MISSING
Firefox 提示 MOZILLA_PKIX_ERROR_REQUIRED_TLS_FEATURE_MISSING,说明带 Must-Staple 标记的证书没有附上 OCSP 装订响应。原因和修法。
网站使用了 HSTS 无法访问
Chrome 对启用 HSTS 的网站遇到证书错误时不提供“继续前往”。为什么会这样、访客能安全检查什么、站长和开发者怎么修。
NET::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED
NET::ERR_CERTIFICATE_TRANSPARENCY_REQUIRED 表示证书缺少 Chrome 要求的证书透明度(CT)SCT 凭证。原因和修法。
ERR_SSL_KEY_USAGE_INCOMPATIBLE
ERR_SSL_KEY_USAGE_INCOMPATIBLE 表示私有 CA 签发的 RSA 证书缺少 Chrome 要求的密钥用途。重新签发并加上 digitalSignature 即可。
只有 Firefox 报 UNKNOWN_ISSUER
网站在 Chrome、Edge 里正常,Firefox 却报 SEC_ERROR_UNKNOWN_ISSUER:根证书库不同、企业根证书、杀毒软件和私有 CA 是主要原因。
DLG_FLAGS_SEC_CERT_CN_INVALID
DLG_FLAGS_SEC_CERT_CN_INVALID 是 IE 和旧版 Edge 的“证书域名不符”错误码,如今多见于 IE 模式、360 兼容模式和老软件。原因和修法。
DLG_FLAGS_INVALID_CA
DLG_FLAGS_INVALID_CA 表示 Windows 不信任证书的签发机构:自签名、内部 CA、缺中间证书或根证书列表过旧。Edge IE 模式和 360 兼容模式下常见。
NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM
NET::ERR_CERT_WEAK_SIGNATURE_ALGORITHM 表示证书或中间证书用 SHA-1、MD5 签名。重新签发 SHA-256 及以上的证书即可。
MOZILLA_PKIX_ERROR_MITM_DETECTED
Firefox 提示 MOZILLA_PKIX_ERROR_MITM_DETECTED,说明杀毒软件、代理或恶意软件正在用不受信任的根证书拦截 HTTPS。如何找出来源并解决。
ERR_BAD_SSL_CLIENT_AUTH_CERT
ERR_BAD_SSL_CLIENT_AUTH_CERT 表示要求客户端证书(mTLS)的网站拒绝了你的证书,或者没收到证书。用户侧原因和服务器修法。
SEC_ERROR_REUSED_ISSUER_AND_SERIAL
Firefox 提示 SEC_ERROR_REUSED_ISSUER_AND_SERIAL,说明两张证书的签发者和序列号相同,常见于路由器、NAS 重新生成了自签名证书。
Chrome“不安全”提示
Chrome 在网页走明文 HTTP、或者有人跳过了证书警告时,会在地址栏显示“不安全”。怎么判断是哪种情况,站长怎么去掉这个提示。
SSL_ERROR_HANDSHAKE_FAILURE_ALERT
SSL_ERROR_HANDSHAKE_FAILURE_ALERT 表示服务器主动中止了 TLS 握手,Firefox 只能显示“建立安全连接失败”。最常见的是要求客户端证书或加密套件过旧。
MOZILLA_PKIX_ERROR_NOT_YET_VALID_CERTIFICATE
Firefox 提示证书“尚未生效”,意思是按你设备的时间,证书的起始日期还没到。多数是电脑时间慢了,少数是证书生成时服务器时间不对。
手机和操作系统
Safari:此连接非私人连接
Safari 提示此连接非私人连接时,怎么在 iPhone、iPad、Mac 上查看是证书过期、域名不符还是签发者不受信任,以及访客和站长分别怎么修。
Safari 无法建立安全连接
Safari 提示无法建立安全连接,说明 TLS 握手失败:服务器 TLS 太旧、内容过滤、VPN 或 DNS 描述文件、屏幕使用时间限制都可能导致。
iOS:无法验证服务器身份
iOS 提示“无法验证服务器身份”,说明邮件或网站服务器的证书校验失败。常见原因:服务器名填错、自签名或证书过期。
NSURLErrorDomain -1200
NSURLErrorDomain Code=-1200 表示 iOS 或 macOS App 的 TLS 握手失败,常和 App Transport Security(ATS)规则有关。排查和修复方法。
NSURLErrorDomain -1202
NSURLErrorDomain -1202 表示 iOS/macOS 应用不信任服务器证书:根证书不受信任、域名或 IP 不匹配、缺中间证书或不符合苹果证书规则。附排查命令。
安卓 App 不信任用户 CA
从 Android 7 起,App 默认忽略用户自己安装的 CA 证书。为什么公司或调试用的根证书在 Chrome 里有效、在 App 里无效,以及如何配置信任。
Trust anchor for certification path not found
安卓 App 报 Trust anchor for certification path not found,说明服务器证书链连不到受信任的根,多数是缺中间证书。原因和修法。
安卓“网络可能会受到监控”
安卓提示“网络可能会受到监控”,是因为设备上装了额外的 CA 证书,HTTPS 流量有被解密的可能。怎么查是谁装的、怎么删除,以及开发调试时怎么安全地用。
老安卓和 Let's Encrypt
Android 7.1.1 之前的系统不信任 ISRG Root X1,2024 年交叉签名到期后,Let's Encrypt 证书在这些设备上报错。访客和站长分别怎么办。
Flutter CERTIFICATE_VERIFY_FAILED
Flutter/Dart 报 CERTIFICATE_VERIFY_FAILED,是 dart:io 无法验证服务器证书。先看冒号后面的具体原因,再修证书链或信任设置,附 Dio 写法。
macOS:此证书不受信任
Mac 钥匙串访问显示“此证书不受信任”或“由未知颁发机构签名”,表示 macOS 连不到受信任的根证书。按公开网站、公司 CA 和开发证书分别处理。
Windows Schannel 报错
解读 Windows Schannel 报错:事件 36887/36888/36874/36871,以及 SEC_E_UNTRUSTED_ROOT 0x80090325、CRYPT_E_NO_REVOCATION_CHECK 等错误码。
系统时间错误
日期或时间不对,所有 HTTPS 网站都会报证书错误。Windows、macOS、iPhone、安卓上怎么改时间,以及为什么会出现这种情况。
杀毒软件 HTTPS 扫描
会扫描 HTTPS 的杀毒软件网页防护会重新签发证书,可能让所有网站都报证书错误。如何确认是它造成的,以及在不丢掉防护的前提下解决。
公共 Wi-Fi 认证页报错
公共 Wi-Fi 的登录认证页会拦截 HTTPS,没登录时打开任何网站都可能报证书错误。说明怎么判断是认证页造成的,以及在电脑和手机上安全打开认证页的方法。
公司 SSL 解密
公司防火墙、上网行为管理设备会解密 HTTPS 再重新签发。根证书没部署好或 App 做了证书固定时,就会出现证书错误。
服务器和代理
SSL 握手失败总览
SSL handshake failed 是个笼统的提示。先找到浏览器、App、CDN 或服务器给出的具体报错,判断握手卡在哪一步,再按对应页面修复。
Nginx: key values mismatch
Nginx 报 SSL_CTX_use_PrivateKey ... key values mismatch,说明私钥不属于 ssl_certificate 文件里的第一张证书。对比公钥哈希,找到原因再修。
Nginx: SSL_CTX_use_PrivateKey failed
Nginx 加载私钥失败,原因可能是私钥不匹配、格式不对、私钥有密码或文件权限问题。看括号里的 OpenSSL 原因,按原因修复。
Nginx: no ssl_certificate is defined
Nginx 日志出现 no ssl_certificate is defined in server listening on SSL port,说明 TLS 握手落到了没配证书的 443 server 块,多是默认站点。补证书或拒绝握手即可。
Apache AH02572: failed to configure certificate
Apache 启动报 AH02572 Failed to configure at least one certificate and key,说明 mod_ssl 没加载到可用的证书私钥对。看它上一行的具体原因,再修私钥、格式或路径。
Apache AH01909
AH01909 是 Apache 启动时的警告:虚拟主机的 ServerName 不在证书的 SAN 或 CN 里。通常是没写 ServerName 或证书配错了,附排查命令。
unsupported certificate purpose(客户端认证 EKU 被移除)
2026 年起公网 TLS 证书不再含 clientAuth 扩展用途,用 Let's Encrypt 等公网证书做 mTLS 客户端证书会失败。原因、确认方法和私有 CA 迁移方案。
IIS:logon session does not exist
IIS 绑定 HTTPS 时报这个错(0x80070520),意思是证书的私钥缺失或无法访问。怎么检查私钥、重新导入 PFX 并重新绑定。
nginx "ssl_stapling" ignored
nginx 无法做 OCSP 装订时会警告 "ssl_stapling" ignored。Let's Encrypt 2025 年关闭 OCSP 后证书里不再有 OCSP 地址,这条警告属于正常现象。
编程语言
Python CERTIFICATE_VERIFY_FAILED
Python 报 [SSL: CERTIFICATE_VERIFY_FAILED] 表示无法验证服务器证书。应补全服务器证书链或给 Python 指定正确的 CA 证书包,而不是 verify=False。
PKIX path building failed
PKIX path building failed 表示 JVM 无法把服务器证书链到信任库里的根证书。多为缺中间证书、企业代理或私有 CA,应补证书链或用 keytool 导入根证书。
Node.js: unable to verify the first certificate
Node.js 报 UNABLE_TO_VERIFY_LEAF_SIGNATURE,几乎都是服务器没发中间证书。补全服务器证书链,或用 NODE_EXTRA_CA_CERTS 补充证书,不要关校验。
x509: certificate signed by unknown authority
Go 程序报 x509: certificate signed by unknown authority,说明服务器证书链找不到受信任的根。应把根证书加入系统或 RootCAs,而不是跳过校验。
self-signed certificate in certificate chain
这个 OpenSSL 报错表示证书链顶端是一张本机不信任的自签名根证书,多半来自公司代理或内网 CA。正确做法是信任那张根证书,而不是关掉校验。
Python SSL WRONG_VERSION_NUMBER
WRONG_VERSION_NUMBER 表示 Python 用 TLS 去连一个返回明文的端口:代理地址写成了 https://、端口用错,或服务器那个端口没开 TLS。
Python SSLEOFError: EOF occurred
SSLEOFError 表示 TLS 连接在握手中途或没有正常关闭就被断开。应排查代理、SNI、TLS 版本和服务器限制,而不是关闭证书校验。
SSLHandshakeException: handshake_failure
Received fatal alert: handshake_failure 表示客户端和服务器谈不拢 TLS 参数,常见于协议版本、加密套件、SNI 或客户端证书问题。
No subject alternative names present
用 IP 访问 HTTPS 而证书没有 SAN 时,Java 报 No subject alternative names present。改用证书里的域名,或重新签发带 IP SAN 的证书。
Node.js: self-signed certificate
Node.js 报 self-signed certificate,说明服务器自己的证书是自签名的。这页讲怎样用 mkcert 本地 CA 或 ca 选项只信任这一张证书,以及为什么不能关校验。
Node.js: certificate has expired
Node.js 报 CERT_HAS_EXPIRED,说明证书链中有证书已过期,或者本机时间不对。依次检查服务器证书、中间证书、系统时钟和过时的镜像地址。
x509: relies on legacy Common Name field
Go 1.15 起不再接受只在 CN 里写域名的证书,Go 1.17 删除了 GODEBUG 开关。唯一修法是重新签发带 SAN 的证书。
.NET remote certificate is invalid
.NET 的 SslStream 拒绝服务器证书时抛出这个异常。先看 SslPolicyErrors 是哪一项,再修证书链、域名或信任库,不要在回调里直接返回 true。
PHP cURL error 60
PHP 报 cURL error 60 表示 libcurl 无法验证服务器证书,多数是 PHP 没配置 CA 证书包。应设置 curl.cainfo,而不是关闭 SSL 校验。
Ruby certificate verify failed
Ruby 报 OpenSSL::SSL::SSLError certificate verify failed 表示无法验证服务器证书链。应让 Ruby 用对 CA 证书包或修好服务器证书链,而不是 VERIFY_NONE。
requests SSLError: Max retries exceeded
requests 同时报 SSLError 和 Max retries exceeded,表示 TLS 握手失败,与重试次数无关。按 Caused by 后面的原因分别修证书链、CA 证书包或代理,不用 verify=False。
UNSAFE_LEGACY_RENEGOTIATION_DISABLED
OpenSSL 3 拒绝连接不支持 RFC 5746 安全重协商的服务器。正解是升级服务器;临时只对这一台主机放开旧式连接,并保持证书校验开启。
urllib3 InsecureRequestWarning
urllib3 发出 InsecureRequestWarning,说明有 HTTPS 请求跳过了证书校验。找到 verify=False,修好它掩盖的证书问题,再把它删掉。
UNABLE_TO_GET_ISSUER_CERT_LOCALLY
Node.js 在自带的 CA 列表里找不到签发服务器证书链的根证书。用 NODE_EXTRA_CA_CERTS 或 --use-system-ca 加入根证书,不要关闭 TLS 校验。
ERR_TLS_CERT_ALTNAME_INVALID
ERR_TLS_CERT_ALTNAME_INVALID 表示服务器证书里没有你访问的域名或 IP。应修正访问地址、SNI 或证书,而不是设置 rejectUnauthorized: false。
Java No appropriate protocol
Java 报 No appropriate protocol,是因为启用的 TLS 版本全被禁用或没有可用的加密套件,多半是代码写死了 TLSv1。改用 TLS 1.2 及以上即可。
Keystore was tampered with
Java 无法通过 JKS 密钥库的完整性校验:多数是库密码不对,也可能是文件被 Maven 资源过滤或错误的传输方式损坏了。
.NET SSL connection could not be established
HttpClient 把所有 TLS 失败都包装成这条消息。先读 InnerException,再分别修信任、域名、协议或连接问题,不要用 DangerousAcceptAnyServerCertificateValidator。
x509: certificate is valid for X, not Y
Go 的 crypto/x509 提示证书的 SAN 里没有你连接的主机名。应修正访问域名、ServerName 或默认证书,而不是设置 InsecureSkipVerify。
rustls invalid peer certificate: UnknownIssuer
rustls 无法把服务器证书链连到根证书库里的任何一张根证书。选对根证书来源(webpki-roots、系统证书或平台校验器),或者加入所需的根证书。
命令行工具
curl: (60) SSL certificate problem
curl 报错 60 表示无法验证服务器证书链。多数是服务器没发中间证书或本机 CA 证书包缺失,应修证书链或指定 CA,而不是加 -k。
Git: SSL certificate problem
git clone 报 SSL certificate problem: unable to get local issuer certificate,说明无法验证 Git 服务器证书。修证书链或配置 http.sslCAInfo,别关校验。
npm: unable to get local issuer certificate
npm install 报 unable to get local issuer certificate,说明 Node.js 不信任镜像源前面的根证书,多是企业代理或私有仓库。用 cafile 或 NODE_EXTRA_CA_CERTS 解决。
pip SSL CERTIFICATE_VERIFY_FAILED
pip 报 CERTIFICATE_VERIFY_FAILED 表示无法验证 PyPI 或镜像源的证书。应升级 pip、用 --cert 或 PIP_CERT 指定证书包,避免 --trusted-host。
curl: (35) SSL connect error
curl 报错 35 表示 TLS 握手本身失败:协议或加密套件不匹配、连接被重置、端口不是 TLS、或者服务器要求客户端证书。按报错后半句定位原因。
curl: (77) certificate verify locations
curl 报错 77 表示读不到 CA 证书文件或目录:没装 ca-certificates、CURL_CA_BUNDLE 或 --cacert 路径错误、文件权限不对。和网站证书无关。
wget: cannot verify certificate
wget 验证不了网站证书,原因是证书链不完整、CA 证书包过旧或代理重新签名。修服务器,或者让 wget 使用正确的 CA 文件。
OpenSSL 错误 20: unable to get local issuer certificate
OpenSSL 错误 20 表示在信任库和提供的中间证书里都找不到某张证书的签发者。先看 depth,再补中间证书或正确的根证书。
OpenSSL 错误 10: certificate has expired
OpenSSL 错误 10 表示验证时证书链里有证书已经过了 notAfter 时间。先看是哪个 depth,再续期站点证书、更换中间证书或修正系统时间。
OpenSSL: unable to load certificate
OpenSSL 报 no start line 或 DECODER unsupported,说明给它的文件不是 PEM 证书。这页教你认出 DER、PKCS#7、PKCS#12、私钥和损坏的 PEM,并给出转换命令。
Maven: PKIX path building failed
Maven 报 PKIX path building failed,是运行 Maven 的 JDK 不信任仓库证书,常见于公司代理和私有 Nexus。把根证书导入正确的 JDK 即可。
Composer SSL operation failed
Composer 报 SSL operation failed 或 curl error 60,表示 PHP 无法验证 Packagist 或镜像源的证书。应修好 PHP 的 CA 证书包,不要开 disable-tls。
unexpected eof while reading
OpenSSL 3 报 unexpected eof while reading,说明对方没发 TLS close_notify 就断开了 TCP。先分清是握手阶段被断开,还是数据传完后没正常关闭。
dh key too small
dh key too small 表示服务器给出的 Diffie-Hellman 参数低于客户端 OpenSSL 的安全级别。应在服务器改用 ECDHE 或 2048 位以上的 DH 参数。
Could not create SSL/TLS secure channel
Windows PowerShell 和 .NET Framework 没能和服务器协商出 TLS,多半是没有启用 TLS 1.2。按微软推荐的方式开启它,跳过证书检查没有用。
AWS CLI SSL validation failed
botocore 在 TLS 校验失败时输出 SSL validation failed for <endpoint>。用 ca_bundle 或 AWS_CA_BUNDLE 指定证书包、改正终端节点,或给 S3 改用路径式寻址。
CondaSSLError
CondaSSLError 表示 conda 下载时 HTTPS 证书校验失败,或者 Python 的 ssl 模块加载失败。用 ssl_verify: truststore 或 CA 证书包解决,不要设成 false。
平台和 DevOps
Docker: x509 signed by unknown authority
docker pull/login 报 x509: certificate signed by unknown authority,是 Docker 守护进程不信任仓库的 CA。用 certs.d 配置 CA,不要用 insecure-registries。
kubectl: x509 signed by unknown authority
kubectl 报 x509: certificate signed by unknown authority,通常是 kubeconfig 里的 CA 和 API Server 证书对不上。重新获取 kubeconfig,不要跳过 TLS 校验。
cert-manager: Certificate not Ready
cert-manager 的 Certificate 一直 READY False,问题出在 Certificate、CertificateRequest、Order、Challenge 中的某一环。用 kubectl describe 顺着链条找到报错再修。
Cloudflare 525 错误
Cloudflare 525 表示 Cloudflare 和源站之间的 TLS 握手失败,和访客无关。按源站证书、SNI、443 端口、加密套件的顺序排查,附 Nginx、宝塔配置示例。
Cloudflare 526 错误
Cloudflare 526 表示 Full (strict) 模式下源站证书没通过校验:过期、自签名、域名不符或缺中间证书。逐项确认的命令和修复方法。
Cloudflare Flexible 重定向循环
Cloudflare 用 Flexible 模式、源站又强制跳 HTTPS,就会出现“将您重定向的次数过多”。怎么确认是这个原因,以及三种修法。
Docker TLS handshake timeout
docker pull 报 net/http: TLS handshake timeout,说明和镜像仓库的 TLS 握手超过了 10 秒。要修的是守护进程代理、网络链路、MTU 或镜像加速地址。
邮件和其他协议
SMTP STARTTLS: certificate verify failed
发邮件时 STARTTLS 之后报 certificate verify failed,原因是邮件服务器证书与主机名不符、自签名、过期或缺中间证书。怎么检查 587 和 465 端口上的证书并修复。
Outlook: 安全证书上的名称无效
Outlook 提示安全证书名称无效,是因为自动发现、IMAP 或 SMTP 连到的服务器证书不包含所用主机名。改用证书上的主机名或修复证书即可。
PostgreSQL: sslmode verify-full 报错
libpq 用 sslmode=verify-full 时,缺少 root.crt、CA 不对或服务器证书与主机名不符都会报错。提供正确的 CA,不要把 sslmode 降级。
MySQL: ERROR 2026 SSL connection error
MySQL 报 ERROR 2026 表示与服务器的 TLS 握手失败:证书验证不过、自动生成的自签名 CA、主机名不匹配,或者没有共同的 TLS 版本。
证书签发和续期
Certbot: Timeout during connect
Let's Encrypt 连不上服务器 80 端口,HTTP-01 验证超时。检查安全组、防火墙、AAAA 记录和“禁止海外访问”,或改用 DNS-01 验证。
Let's Encrypt 速率限制(rateLimited)
Let's Encrypt 返回 rateLimited 或 too many certificates,说明触发了签发限制。教你看懂是哪一项、等多久恢复、以后怎么避免。
CAA record prevents issuance
CA 查到的 CAA 记录里没有自己,所以不能签发。找出生效的 CAA 记录,加上 CA 的标识(letsencrypt.org、pki.goog 等)后重试。
Certbot: unauthorized, Invalid response 403
Let's Encrypt 连上了服务器,但取验证文件时被返回 403 Forbidden。多是禁止访问点开头路径的规则、WAF 或文件权限导致,放行 /.well-known/acme-challenge/ 后重试。
Certbot: DNS problem NXDOMAIN
Let's Encrypt 查询域名时被告知不存在。检查拼写、解析记录、DNS 服务器是否生效、域名是否被暂停解析(实名未通过、过期),以及 DNS-01 的 TXT 记录位置。
acme.sh: Verify error
acme.sh 输出 Verify error 表示 CA 验证域名失败。冒号后面的内容(404、403、超时、NXDOMAIN、TXT 不对)说明是 HTTP-01 还是 DNS-01 的哪一环出了问题。
Certbot:Could not bind TCP port 80
Certbot 的 standalone 插件要自己监听 80 端口,Nginx、宝塔等已经占用 80 或没用 root 运行时就会报这个错。改用 webroot/nginx 插件,或者用钩子临时停服务。
Certbot:SERVFAIL looking up CAA
Let's Encrypt 查询 CAA 记录时拿到 SERVFAIL,于是拒绝签发。多数是 DNSSEC 配置坏了、权威 DNS 不认 CAA 查询或者 DNS 故障,附 dig 排查命令。
常见问题
看到证书报错,一定是网站的问题吗?
不一定。相当一部分是访客这边造成的:系统时间不对、杀毒软件的 HTTPS 扫描、公司网络的代理、酒店和机场 Wi-Fi 的登录页,或者系统太老不认新的根证书。先用 SSL 检测 查一下网站,从我们的服务器看正常,问题就在出错的那台设备或那个网络上。
浏览器提示“继续前往(不安全)”,能点吗?
只有在你自己管理的设备或网站上、并且清楚为什么报错时才可以点,比如家里路由器后台用的自签名证书。凡是要登录、付款或填个人信息的网站都不要绕过:浏览器已经无法确认对面就是网站的服务器,你发出去的内容可能被别人看到或篡改。
为什么同一个网站换个浏览器就不报错了?
各浏览器用的信任库和“自动补救”机制不一样。Chrome 和 Safari 常常会自己去下载缺失的中间证书,Firefox 靠预加载的公开中间证书列表,大多数命令行工具和 App 两样都没有,所以证书链不完整时只有部分客户端报错。可以运行 curl ssl.sh/example.com 或用 证书链工具 看服务器实际发出的证书链。