生成自签名根证书
创建根证书私钥openssl genrsa -out root.key 2048
创建根证书请求文件:
后续参数请自行填写,下面是一个例子:
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:BJ
Locality Name (eg, city) [Default City]:BJ
Organization Name (eg, company) [Default Company Ltd]:Poolin
Organizational Unit Name (eg, p) []:dev
Common Name (eg, your name or your servers hostname) []:tls.ljh.cool
Email Address []:jiahao.li@poolin.com
A challenge password []:
An optional company name []:
创建根证书(20年有效期):
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 73000
注意:在创建证书请求文件的时候需要注意三点,下面生成服务器请求文件和客户端请求文件均要注意这三点:
*Common Name 填写证书对应的服务域名;
*所有字段的填写,根证书、服务器端证书、客户端证书需保持一致
*最后的密码可以直接回车跳过。
生成自签名服务器端证书
生成服务器端证书私钥:
openssl genrsa -out server.key 2048
生成服务器证书请求文件
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 73000
生成自签名客户端证书
生成客户端证书秘钥
openssl genrsa -out client.key 2048
生成客户端证书请求文件
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 73000
nginx配置文件:
7层:
为了客户端方便导入,同样还是需要将证书文件转换成 P12 格式。当然你还可以在转换的过程中给证书加个密码,以保证证书的安全
openssl pkcs12 -export -clcerts -in hi-linux.com.pem -inkey hi-linux.com.key -out hi-linux.com-client.p12
http {
include mime.types;
server {
listen 443 ssl;
server_name tls.ljh.cool;
ssl_certificate /路径/server.crt;
ssl_certificate_key /路径/server.key;
ssl_client_certificate /路径/client.crt;
ssl_verify_client on;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
}
}
4层:
stream模块用来实现四层协议转发
server {
listen 端口 ssl;
proxy_pass backend-service;
proxy_protocol on;
ssl_certificate /路径/server.crt;
ssl_certificate_key /路径/server.key;
ssl_client_certificate /路径/client.crt;
ssl_verify_client on;
ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
ssl_handshake_timeout 30s;
ssl_session_timeout 4h;
ssl_session_cache shared:SSL:50m;
ssl_ciphers HIGH:!aNULL:!MD5;
proxy_buffer_size 128k;
# ssl_handshake_timeout 30s;
# ssl_session_timeout 1d;
# ssl_session_cache shared:SSL:50m;
# ssl_session_tickets off;
# ssl_protocols TLSv1.2 TLSv1.3;
# ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256;
# ssl_prefer_server_ciphers on;
}
upstream backend-service {
server 172.17.0.1:1800;
}
相关参数:
ssl_certificate #server公钥证书
ssl_certificate_key #server私钥
ssl_client_certificate #客户端公钥证书
ssl_verify_client on; #开启客户端证书验证
测试:
四层测试:
openssl s_client -tls1_2 -showcerts -cert client.crt -key client.key -connect tls.ljh.cool:端口
可以建立连接短时间不掉线并通过post上传json数据即可判断认证成功
7层测试:
直接网站访问会返回400
curl直接测试:
curl使用证书测试:
curl --cert ./client.crt --key ./client.key https://tls.ljh.cool -k -v
发布者:LJH,转发请注明出处:https://www.ljh.cool/35615.html