https 双向证书认证踩坑 (nginx)

梦浪的小虾米
2022-09-15 / 1 评论 / 1,032 阅读 / 正在检测是否收录...

背景

公司的后台被别有用心的人攻击了,导致公司损失了几个小目标。恰巧与世隔绝的技术总监回来了,他提出把后台设置成证书访问(https 双向访问认证),即:用户访问后台地址的时候,本地需要安装特定的公钥证书,然后才能访问后台,不然 nginx 就直接返回 400 ,然后让我来试试看怎么弄。踩了一下午的坑,总算是走通了流程。

看看原理

不复制了,你们自己去看:https://blog.csdn.net/easylife206/article/details/107776854

小白流程

  1. 创建根证书

    openssl genrsa -out root.key 2048
  2. 创建根证书请求文件:

    openssl req -new -out root.csr -key root.key
  3. 创建根证书

    openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650

    在创建证书请求文件的时候需要注意三点,下面生成服务器请求文件和客户端请求文件均要注意这三点:

    • Common Name 填写证书对应的服务域名;
    • 所有字段的填写,根证书、服务器端证书、客户端证书需保持一致
    • 最后的密码可以直接回车跳过。
  4. 创建服务器端证书私钥

    openssl genrsa -out server.key 1024
  5. 创建服务器端证书请求文件

    openssl req -new -out server.csr -key server.key
  6. 创建服务器端公钥文件

    openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650
  7. 创建客户端证书私钥

    openssl genrsa -out client.key 1024
  8. 创建客户端证书请求文件

    openssl req -new -out client.csr -key client.key
  9. 创建客户端证书公钥

    openssl x509 -req -in client.csr -out client.crt -signkey client.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650
  10. 创建win可用的p12格式证书

    
     openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12
    
     (-clcerts 可以去掉)
  11. 修改nginx配置(示例)

    server {
            listen       443 ssl;
            server_name  www.yourdomain.com;
            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;  #开启客户端证书验证  
    
            location / {
                root   html;
                index  index.html index.htm;
            }
        }
  1. 测试配置是否正常

    curl --cacert root.crt  --cert ./client.crt --key ./client.key https://test.cc  --resolve test.cc:443:127.0.0.1
    
  2. 把生成的证书导入本地浏览器

    root.crt 导入受信任的根证书颁发机构
    
    client.p12 直接点击该文件进行自动导入,一切默认选项。
    

Tips

  • 所有字段的填写,根证书、服务器端证书、客户端证书需保持一致
  • 最后的密码可以直接回车跳过。
  • 本博主建议:配置完 nginx 后,重启了 nginx 就开始使用 curl 进行请求,确认自己的配置是否 ok。然后在进行浏览器的调整。我一开始都摸不着头脑,不知道怎么弄。
  • 本博主建议使用 ie 浏览器调整浏览器访问的效果,不然谷歌和火狐坑的你不知道东南西北。ie 是改完就能看到效果,而 chrome 是需要重启电脑才会看到效果。
  • 根证书的Common Name填写root就可以,所有客户端和服务器端的证书这个字段需要填写域名,一定要注意的是,根证书的这个字段和客户端证书、服务器端证书不能一样(本博主在总结一下:ca证书是指颁发机构的名字,所以尽量写一个自己知道的名字,而服务器要和客户端的名字一样);
  • Nginx 的 ssl_client_certificate 需要配置根证书 root.crt,而不是客户端证书;
  • 有一点需要注意的就是,如果客户端证书不是由根证书直接颁发的,配置中还需要加一个配置:ssl_verify_depth 1;

一些快捷键

windows:
mmc 证书管理
certmgr.msc 证书管理

参考

https://www.cnblogs.com/xiao987334176/p/11041241.html
https://blog.51cto.com/tchuairen/1782945
https://blog.csdn.net/easylife206/article/details/107776854
https://blog.51cto.com/u_15148274/5502780
https://www.jianshu.com/p/2b2d1f511959
https://www.jianshu.com/p/003c6fb3dc2d
https://www.cnblogs.com/smilexumu/p/9039251.html
https://blog.csdn.net/a82514921/article/details/104587416
https://blog.csdn.net/a82514921/article/details/104587416
https://blog.csdn.net/weixin_39611308/article/details/110794666
https://www.xitongcheng.com/jiaocheng/win10_article_67483.html
https://github.com/avwo/whistle/issues/22
https://blog.csdn.net/Drug_/article/details/100893157
https://www.hi-linux.com/posts/38492.html#vip-container

1

评论 (1)

取消
  1. 头像
    梦浪
    Windows 10 · Google Chrome

    ### 使用下列命令,直接复制粘贴,一键创建你自己的ca,服务器,客户端 证书

    openssl genrsa -out yourweb_root.key 2048
    openssl req -new -out yourweb_root.csr -key yourweb_root.key -subj "/C=cn/ST=beijing/L=beijing/O=beijing/OU=beijing/CN=zjzgabus"
    openssl x509 -req -in yourweb_root.csr -out yourweb_root.crt -signkey yourweb_root.key -CAcreateserial -days 3650
    openssl genrsa -out yourweb_server.key 2048
    openssl req -new -out yourweb_server.csr -key yourweb_server.key -subj "/C=cn/ST=beijing/L=beijing/O=beijing/OU=beijing/CN=bus.zjzg.com"
    openssl x509 -req -in yourweb_server.csr -out yourweb_server.crt -signkey yourweb_server.key -CA yourweb_root.crt -CAkey yourweb_root.key -CAcreateserial -days 3650
    openssl genrsa -out yourweb_client.key 2048
    openssl req -new -out yourweb_client.csr -key yourweb_client.key -subj "/C=cn/ST=beijing/L=beijing/O=beijing/OU=beijing/CN=bus.zjzg.com"
    openssl x509 -req -in yourweb_client.csr -out yourweb_client.crt -signkey yourweb_client.key -CA yourweb_root.crt -CAkey yourweb_root.key -CAcreateserial -days 3650
    openssl pkcs12 -export -clcerts -in yourweb_client.crt -inkey yourweb_client.key -out yourweb_client.p12

    回复