nginx使用自签证书进行双向TLS加密

生成自签名根证书

创建根证书私钥
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数据即可判断认证成功

nginx使用自签证书进行双向TLS加密

7层测试:

直接网站访问会返回400

nginx使用自签证书进行双向TLS加密

curl直接测试:

nginx使用自签证书进行双向TLS加密

curl使用证书测试:

curl --cert ./client.crt --key ./client.key https://tls.ljh.cool -k -v

nginx使用自签证书进行双向TLS加密

发布者:LJH,转发请注明出处:https://www.ljh.cool/35615.html

(0)
上一篇 2023年4月19日 下午5:52
下一篇 2023年4月20日 上午1:39

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注