Nginx 配置 Https 双向验证

1,040 阅读1分钟

1. CA

  1. 生成 CA 私钥

    openssl genrsa -aes256 -out ca-key.pem 4096
    
  2. 生成 CA 证书

    openssl req -new -x509 -days 365 -key ca-key.pem -sha256 -out ca.pem
    

2. Server

  1. 生成 Server 私钥

    openssl genrsa -out server-key.pem 4096
    
  2. 生成 Server 证书签名请求文件 ( CSR )

    openssl req -sha256 -new -key server-key.pem -out server.csr
    
  3. 生成 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

  1. 生成 Client 私钥

    openssl genrsa -out key.pem 4096
    
  2. 生成 Client 证书签名请求文件 (CSR)

    openssl req -new -key key.pem -out client.csr
    
  3. 生成 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. 浏览器

    # 1. certmgr.msc 导入受信任的根证书 ca.pem
    
    # 2. certmgr.msc 导入个人证书 cert.p12
    
  2. 命令行

    curl https://xxxxx/index.html \
    --cacert ./ca.pem \
    --cert ./cert.pem \
    --key ./key.pem