1. CA
-
生成 CA 私钥
openssl genrsa -aes256 -out ca-key.pem 4096
-
生成 CA 证书
openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
2. Server
-
生成 Server 私钥
openssl genrsa -out server-key.pem 4096
-
生成 Server 证书签名请求文件 ( CSR )
openssl req -sha256 -new -key server-key.pem -out server.csr
-
生成 Server 证书
# 指定 SAN (CN 和 SAN 的区别见:http://tny.im/YwjYk) echo subjectAltName = IP:192.168.200.135,IP:127.0.0.1 >> extfile.cnf # 指定 额外用途 echo extendedKeyUsage = serverAuth >> extfile.cnf # 生成证书 openssl x509 -req -days 365 -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out server-cert.pem -extfile extfile.cnf
3. Client
-
生成 Client 私钥
openssl genrsa -out key.pem 4096
-
生成 Client 证书签名请求文件 (CSR)
openssl req -new -key key.pem -out client.csr
-
生成 Client 证书
# 客户端证书 只做认证 echo extendedKeyUsage = clientAuth > extfile-client.cnf # 生成证书 openssl x509 -req -days 365 -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem \ -CAcreateserial -out cert.pem -extfile extfile-client.cnf # 转 PKCS 证书 (证书和秘钥存放同一个文件) openssl pkcs12 -export -in cert.pem -inkey key.pem -out cert.p12
4. Nginx 配置
server {
listen 443 ssl;
server_name localhost;
# open server authentication
ssl_certificate /work/ssl/vue3-admin/server-csr.pem;
ssl_certificate_key /work/ssl/vue3-admin/server-key.pem;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
# optimization
ssl_session_cache shared:SSL:10m; # 1m: 4000 session
ssl_session_timeout 1m; # 默认 5 分钟缓存,设置 10 或 30 即可
# open client authentication
ssl_client_certificate /work/ssl/vue3-admin/ca.pem;
ssl_verify_client on;
location / {
root /work/web/vue3-admin/;
index index.html index.htm;
}
}
5. 访问
-
浏览器
# 1. certmgr.msc 导入受信任的根证书 ca.pem # 2. certmgr.msc 导入个人证书 cert.p12
-
命令行
curl https://xxxxx/index.html \ --cacert ./ca.pem \ --cert ./cert.pem \ --key ./key.pem