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