使用openssl自建证书实现双向认证模式

721 阅读2分钟

为保证数据传输安全客户端和服务器端都需要验证对方的身份,在建立 HTTPS 连接的过程中,在建立 HTTPS 连接的过程中,客户端从服务器端下载服务器端公钥证书进行验证,还需要把客户端的公钥证书上传到服务器端给服务器端进行验证,等双方都认证通过了,才开始建立安全通信通道进行数据传输。

认证.png

1. 生成根证书

请提前安装openssl程序

openssl genrsa -out root.key 2048
openssl req -new -out root.csr -key root.key
#证书有效期10年
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650
openssl x509 -in root.crt -out root.pem -outform pem 

2. 生成服务端证书  

openssl genrsa -out server.key 2048
# Common Name填写访问服务器时域名,不能与root.crt的相同
openssl req -new -out server.csr -key server.key
# 证书有效期1年
openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 365

3. 生成客户端证书

openssl genrsa -out client.key 2048
# Common Name填写访问服务器时域名,不能与root.crt的相同;填写的域名需提供给数据需方
openssl req -new -out client.csr -key client.key
# 证书有效期1年
openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -days 365
openssl x509 -in client.crt -out client.pem -outform pem 

其中client.key,client.pem,root.pem文件和客户端域名需提供给数据需方。

4. Nginx双向证书配置

server {
        listen       443 ssl;
        #server_name  服务域名;
        server_tokens off;
        ssl on;
        #server公钥证书
        ssl_certificate      server.crt;
        #server私钥
        ssl_certificate_key  server.key;
        #pem格式根证书
        ssl_client_certificate root.pem; 
        #开启客户端证书验证
        ssl_verify_client on;  
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
  
        location / {
             root   html;
             index  index.html index.htm;
        }
     }
 server {
        listen       8080;
        #server_name  服务域名;
        location  /upstream  {
             proxy_pass 对方服务器访问地址/;
             proxy_ssl_certificate      对方服务器客户端证书client.pem;
             proxy_ssl_certificate_key  对方服务器客户端证书私玥client.key;
             proxy_ssl_trusted_certificate 对方服务器客户端根证书root.pem;
             #打开ssl验证
             proxy_ssl_verify       on;
             #设置ssl验证深度
             proxy_ssl_verify_depth 2;
             #ssl会话重用
             proxy_ssl_session_reuse on;
             #指定SSL协议和密码
             proxy_ssl_protocols TLSv1.2 TLSv1.1;
             proxy_ssl_ciphers   HIGH:!aNULL:!MD5;
             proxy_ssl_name 对方服务器客户端域名;
        }
   }

5. 验证Nginx双向证书配置

curl -v -s -k --key 服务端client.key --cert ./服务端client.crt:服务端证书密码 https://192.168.2.100:443