浏览器

ERR_BAD_SSL_CLIENT_AUTH_CERT:网站不接受你的客户端证书

作者: · 最后核实

报错信息ERR_BAD_SSL_CLIENT_AUTH_CERT

ERR_BAD_SSL_CLIENT_AUTH_CERT 的意思是:网站要求你用客户端证书证明身份,而 Chrome 提供的证书没被接受(或者没有提供)。 这出现在使用双向 TLS(mTLS)的网站上:企业门户、政务系统、部分企业网银以及 API 接口。

先判断是网站的问题还是你电脑的问题

问题通常出在你设备上的客户端证书,或者你的账号没有访问权限。先用 SSL 检测(curl ssl.sh/example.com)确认服务器自己的证书没问题,再看服务器要求哪些客户端 CA:

openssl s_client -connect example.com:443 -servername example.com </dev/null 2>/dev/null \
  | sed -n '/Acceptable client certificate CA names/,/Requested Signature/p'

服务器列出了可接受的客户端 CA,而你的证书不是它们签发的,就是证书不对。服务器没列出任何 CA,或者所有用户同时开始报错,就是服务器配置变了。

原因

最常见的情况是浏览器找不到可用的客户端证书,比如 U 盾没插。

1. 没有可用的客户端证书

证书存放在智能卡或 USB Key(俗称“U 盾”“Key”)里,但没插上、驱动或证书助手没启动,或者证书从没装到这台电脑、这个浏览器配置文件里。很多政务和企业系统要求先安装 CA 机构提供的证书客户端。

2. 客户端证书过期或被吊销

客户端证书和服务器证书一样会过期。在系统证书管理器里看有效期(Windows 运行 certmgr.msc → 个人;macOS 打开钥匙串访问 → 我的证书)。

3. 选错了证书

装了好几张个人证书时,Chrome 可能选了或记住了错误的那张。重启浏览器重新选择。

4. 服务器信任的是另一个客户端 CA

服务器的客户端 CA 文件(Nginx 的 ssl_client_certificate)里没有签发你证书的 CA,常见于 CA 更换之后。用命令行测试:

curl -v --cert client.pem --key client.key https://example.com/ -o /dev/null

5. 缺 clientAuth 扩展密钥用途

扩展密钥用途里没有 clientAuth 的证书,会被检查 EKU 的服务器拒绝。用 证书解析 查看。

在各浏览器/系统上的样子

Chrome 内核的浏览器显示 ERR_BAD_SSL_CLIENT_AUTH_CERT,Firefox 和 curl 显示的是服务器发回的 TLS 告警名称。

浏览器 显示内容
Chrome / Edge / 360 / QQ 浏览器 “此网站无法提供安全连接”,说明网站不接受您的登录证书或您未提供,代码 ERR_BAD_SSL_CLIENT_AUTH_CERT
Firefox “建立安全连接失败”,代码 SSL_ERROR_BAD_CERT_ALERT 或 SSL_ERROR_HANDSHAKE_FAILURE_ALERT
Safari 无法打开网页,或弹出证书选择框
curl alert bad certificate 或 alert certificate required(TLS 1.3 告警 116)

站长怎么修

服务器信任的客户端 CA 必须和用户证书的签发者一致;握手失败时,还要给用户一条看得懂的提示。

1. 让服务器指向正确的客户端 CA 文件。

ssl_client_certificate /etc/nginx/ssl/client-ca.pem;
ssl_verify_client on;
ssl_verify_depth 2;

2. 使用专门的客户端 CA,签发的证书带 extendedKeyUsage=clientAuth;不要依赖公开的服务器证书做客户端认证。

3. 给用户留一条明白的路。 在 Nginx 日志里记录 $ssl_client_verify 和 $ssl_client_s_dn,方便客服排查握手为什么失败;也可以用 ssl_verify_client optional,由应用返回一个说明清楚的错误页,而不是让用户看到光秃秃的 TLS 失败。

4. 改完从外部检查。 运行 curl ssl.sh/example.com。原理见 mTLS 双向认证。

常见问题

Chrome 记住了错误的证书,怎么重新选?

关闭所有 Chrome 窗口(或重启浏览器)再打开网站,证书选择框会重新出现,因为 Chrome 只在本次会话里记住你的选择。公司统一管理的电脑上,可能是 AutoSelectCertificateForUrls 策略替你选了。

我从没装过客户端证书,网站为什么要?

这个网站(或其中一部分)配置成用证书登录,常见于公司门户、政务服务、部分企业网银和 API 接口。向网站管理员询问如何申领,自己生成的证书是用不了的。

能把网站的 TLS 证书当客户端证书用吗?

越来越不行了。公开 CA 正在从服务器证书里去掉 clientAuth 扩展密钥用途,检查 EKU 的服务器会拒绝它们。请使用专门的客户端 CA 签发的证书,见 clientAuth EKU 移除。

资料来源

  1. Chromium net_error_list.h
  2. RFC 8446 4.3.2 节:Certificate Request
  3. nginx ngx_http_ssl_module: ssl_verify_client
  4. RFC 5280 4.2.1.12 节:Extended Key Usage