双向 TLS(mTLS)证书生成器
一整套双向 TLS 套件:一个 CA、一张服务端证书,以及最多 10 张客户端证书——每张客户端证书还会额外导出为带密码的 PKCS#12 文件,可直接导入浏览器与操作系统。全部在浏览器中完成,不会上传到任何服务器。
一个 CA、一张服务端证书与最多 10 张客户端证书,每张客户端证书都有可下载的 .p12 打包文件,供浏览器与操作系统导入。
CA 名称请使用英文(ASCII)字符。
— 或在下方粘贴 PEM —
— 或在下方粘贴 PEM —
文件只在你的浏览器本地读取,不会上传到任何服务器。
多个条目用逗号或空格分隔,通用名称会自动加入。
客户端依次命名为 client-1、client-2……每个客户端会得到一张证书、一把私钥,以及一个 .p12 打包文件(内含客户端证书、私钥和 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 文件即可同时导入客户端证书与私钥,按提示输入导出密码。
- 双击
client-1.p12启动证书导入向导。 - 选择「当前用户」(服务用可选「本地计算机」),点击「下一步」。
- 输入导出密码;若以后可能迁移,请勾选「标志此密钥可导出」。
- 选择「根据证书类型自动选择证书存储」→「下一步」→「完成」。
- 此后 Chrome、Edge 在站点索要客户端证书时会自动列出它。可在「设置 → 隐私和安全 → 安全 → 管理设备证书」中确认。
等价的命令行写法:
certutil -importpfx -user -p changeit client-1.p12 certutil -store -user My
- 双击
client-1.p12—— 「钥匙串访问」会打开。 - 选择「登录」钥匙串(整机使用可选「系统」),点击「添加」。
- 输入导出密码以解锁打包文件。
- 证书与私钥会成对出现在「我的证书」下。
- 访问 mTLS 站点时 Safari、Chrome 会自动提供该证书。可用
security find-identity -p ssl-client确认。
等价的命令行写法:
security import client-1.p12 -k ~/Library/Keychains/login.keychain-db \ -P changeit -T /usr/bin/curl security find-identity -p ssl-client
Linux 下多数工具直接读取 PEM,通常 client-1.crt + client-1.key 就够用:
curl --cacert ca.crt --cert client-1.crt --key client-1.key https://example.com/ openssl s_client -connect example.com:443 -CAfile ca.crt \ -cert client-1.crt -key client-1.key
把 .p12 导入 Firefox 或 Chrome(Linux 上两者都用 NSS 证书库):
# Firefox / Chrome 共用 NSS 数据库 pk12util -i client-1.p12 -d sql:$HOME/.pki/nssdb -W changeit certutil -L -d sql:$HOME/.pki/nssdb
需要用 openssl 从打包文件里取出 PEM 时:
openssl pkcs12 -in client-1.p12 -clcerts -nokeys -out client-1.crt -passin pass:changeit openssl pkcs12 -in client-1.p12 -nocerts -nodes -out client-1.key -passin pass:changeit
6. 让客户端信任 CA
客户端仍需把 ca.crt 放入信任库,否则会拒绝服务端证书。
- 双击
ca.crt,选择「安装证书…」。 - 选择「本地计算机」→「下一步」(确认 UAC 提权提示)。
- 选择「将所有证书放入下列存储」→「浏览…」
- 选择「受信任的根证书颁发机构」→「下一步」→「完成」。
certutil -addstore -f "ROOT" ca.crt certutil -store ROOT
- 双击
ca.crt—— 「钥匙串访问」会打开。 - 把它拖到「系统」钥匙串的「证书」分类下。
- 双击它,展开「信任」,把「使用此证书时」设为「始终信任」。
sudo security add-trusted-cert -d -r trustRoot \ -k /Library/Keychains/System.keychain ca.crt
Debian / Ubuntu / Mint
sudo cp ca.crt /usr/local/share/ca-certificates/my-root-ca.crt sudo update-ca-certificates
RHEL / CentOS / Fedora / Rocky / AlmaLinux
sudo cp ca.crt /etc/pki/ca-trust/source/anchors/my-root-ca.crt sudo update-ca-trust extract
Arch / Manjaro
sudo trust anchor --store ca.crt
验证
openssl verify -CAfile ca.crt server.crt openssl verify -CAfile ca.crt client-1.crt
更多工具:自签名证书生成器 · 私有 CA 证书生成器 · CSR 生成器 · 证书解码器