双向 TLS(mTLS)证书生成器

一整套双向 TLS 套件:一个 CA、一张服务端证书,以及最多 10 张客户端证书——每张客户端证书还会额外导出为带密码的 PKCS#12 文件,可直接导入浏览器与操作系统。全部在浏览器中完成,不会上传到任何服务器。

双向 TLS 套件 最多 10 张客户端证书 PKCS#12 导出 · RSA 2048 · SAN

一个 CA、一张服务端证书与最多 10 张客户端证书,每张客户端证书都有可下载的 .p12 打包文件,供浏览器与操作系统导入。

CA 名称请使用英文(ASCII)字符。


多个条目用逗号或空格分隔,通用名称会自动加入。


客户端依次命名为 client-1client-2……每个客户端会得到一张证书、一把私钥,以及一个 .p12 打包文件(内含客户端证书、私钥和 CA 证书)。前缀只能使用字母、数字、点、连字符和下划线。

ca.crt 根 CA 证书 —— 服务端与客户端都需要安装
ca.key 根 CA 私钥 —— 请离线保存,切勿放在 Web 服务器上
server.key 服务端私钥(PEM)——切勿外泄
server.crt 服务端证书(PEM),由上方 CA 签发

客户端证书

如何在 Nginx 中启用双向 TLS

1. 部署服务端文件

sudo mkdir -p /etc/nginx/ssl
sudo cp server.crt ca.crt /etc/nginx/ssl/
sudo cp server.key /etc/nginx/ssl/server.key
sudo chmod 600 /etc/nginx/ssl/server.key

2. 要求客户端出示证书

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate         /etc/nginx/ssl/server.crt;
    ssl_certificate_key     /etc/nginx/ssl/server.key;

    # 签发客户端证书所用的 CA
    ssl_client_certificate  /etc/nginx/ssl/ca.crt;
    ssl_verify_client       on;
    ssl_verify_depth        2;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_session_cache shared:SSL:10m;

    location / {
        proxy_set_header X-Client-DN $ssl_client_s_dn;
        proxy_set_header X-Client-Verify $ssl_client_verify;
        proxy_pass http://127.0.0.1:8080;
    }
}

如果希望同时接受普通访客与已认证客户端,把 ssl_verify_client 改为 optional,然后在应用里检查 $ssl_client_verify

3. 检查并重载

sudo nginx -t
sudo systemctl reload nginx

4. 以客户端身份连接

# 使用 PEM 证书 + 私钥
curl --cacert ca.crt --cert client-1.crt --key client-1.key https://example.com/

# 使用 PKCS#12 打包文件
curl --cacert ca.crt --cert-type P12 --cert client-1.p12:changeit https://example.com/

5. 在电脑上安装客户端证书

双击 .p12 文件即可同时导入客户端证书与私钥,按提示输入导出密码。

  1. 双击 client-1.p12 启动证书导入向导。
  2. 选择「当前用户」(服务用可选「本地计算机」),点击「下一步」。
  3. 输入导出密码;若以后可能迁移,请勾选「标志此密钥可导出」。
  4. 选择「根据证书类型自动选择证书存储」→「下一步」→「完成」。
  5. 此后 Chrome、Edge 在站点索要客户端证书时会自动列出它。可在「设置 → 隐私和安全 → 安全 → 管理设备证书」中确认。

等价的命令行写法:

certutil -importpfx -user -p changeit client-1.p12
certutil -store -user My

6. 让客户端信任 CA

客户端仍需把 ca.crt 放入信任库,否则会拒绝服务端证书。

  1. 双击 ca.crt,选择「安装证书…」。
  2. 选择「本地计算机」→「下一步」(确认 UAC 提权提示)。
  3. 选择「将所有证书放入下列存储」→「浏览…」
  4. 选择「受信任的根证书颁发机构」→「下一步」→「完成」。
certutil -addstore -f "ROOT" ca.crt
certutil -store ROOT

更多工具:自签名证书生成器 · 私有 CA 证书生成器 · CSR 生成器 · 证书解码器