1. 创建根证书

#创建根证书私钥:
openssl genrsa -out root.key 1024

#创建根证书请求文件:
openssl req -new -out root.csr -key root.key
#创建根证书:
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650
  • 证书的Common Name可填写为 root . 所有客户端和服务器端的证书这个字段需要填写域名或者ip,一定要注意的是,根证书的这个字段和客户端证书、服务器端证书不能一样
  • 其他所有字段的填写,根证书、服务器端证书、客户端证书需保持一致
  • 无用项可以选择直接回车跳过

最终得到:

  • root.crt : 签名有效期为10年的根证书
  • root.key: 根证书私钥文件
  • root.csr: 根证书请求文件

后面我们可以用这个根证书去颁发服务器证书和客户端证书

2. 根据根证书创建服务端证书

#生成服务器端证书私钥:
openssl genrsa -out server.key 1024

#生成服务器证书请求文件,过程和注意事项参考根证书,本节不详述:
openssl req -new -out server.csr -key server.key

#生成服务器端公钥证书
openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650

通过上面的三个命令,我们得到:

server.key:服务器端的秘钥文件
server.crt:有效期十年的服务器端公钥证书,使用根证书和服务器端私钥文件一起生成
root.srl: CA签发证书的序列号记录文件,全名是 root.Serial 。
server.csr : 服务端证书请求文件(请求证书时使用, 后续配置无用)

3. 根据根证书创建客户端证书

需要注意的是, 可以生成多个客户端证书, 只需安装下面1-4步重新生成即可

#生成客户端证书秘钥:
openssl genrsa -out client.key 1024

#生成客户端证书请求文件,过程和注意事项参考根证书,本节不详述:
openssl req -new -out client.csr -key client.key

#生客户端证书
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650

#生客户端p12格式证书,需要输入一个密码,选一个好记的,比如123456
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

重复使用上面的三个命令,我们得到:

client.key:客户端的私钥文件
client.crt:有效期十年的客户端证书,使用根证书和客户端私钥一起生成
client.p12:客户端p12格式,这个证书文件包含客户端的公钥和私钥,主要用来给浏览器或postman访问使用
clinet.csr : 客户端证书请求文件(请求证书时使用, 后续配置无用)
 

4. nginx配置

server {
        listen       443 ssl;
        server_name  www.yourdomain.com;# 无域名可填写ip
        ssl                  on;  
        ssl_certificate      /data/sslKey/server.crt;  #server公钥证书
        ssl_certificate_key  /data/sslKey/server.key;  #server私钥
        ssl_client_certificate /data/sslKey/root.crt;  #根证书,可以验证所有它颁发的客户端证书
        ssl_verify_client on;  #开启客户端证书验证  

		# 反向代理eg: 作用是通过https(443端口)访问, 则会直接去请求本机的8991端口
		 location / {
           	proxy_pass http://127.0.0.1:8991/;
    		  }

		
        #location / {
        #    root   html;
        #    index  index.html index.htm;
        # }
    }

注意:

配置的主要内容是配置了服务器端证书的公钥私钥以及根证书的公钥, 并且ssl_verify_client 参数设置为 on

如果客户端证书不是由根证书直接颁发的,配置中还需要加一个配置:ssl_verify_depth 1;

配置完成后,通过nginx -s reload 令配置文件重新加载, 无需重启

如果手里面只有通过正规途径申请下来的证书(而不是上面自签证做法), 得到的证书如下面所示, 这里只有服务端证书而没有服务端和根证书, 所以仍需要我们以自签证的方式生成根证书以及客户端证书

访问测试

访问方式1:curl带证书访问

curl --cert ./client.crt --key ./client.key https://xxx.xxx.com -k

访问方式2:postman

1.在设置General中先把SSL certificate verification关掉

nginx ssl 双向 nginx证书双向认证_nginx

 2.可以Certificates中配置p12文件,p12文件可以认为是一对公私钥的合体文件, 同时也要配置p12文件的密码。注意这里的地址和端口要与实际的一致,否则请求时会认证失败。

nginx ssl 双向 nginx证书双向认证_nginx ssl 双向_02

 3.也可以在Certificates中配置客户端公私钥证书。无需配置密码

nginx ssl 双向 nginx证书双向认证_客户端_03