当前位置: 首页 > news >正文

nginx实现双向认证

1. 创建根证书

#创建根证书私钥:
openssl genrsa -out root.key 1024

#创建根证书请求文件:
openssl req -new -out root.csr -key root.key
#创建根证书:
openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650
  • 证书的Common Name可填写为 root . 所有客户端和服务器端的证书这个字段需要填写域名或者ip,一定要注意的是,根证书的这个字段和客户端证书、服务器端证书不能一样
  • 其他所有字段的填写,根证书、服务器端证书、客户端证书需保持一致
  • 无用项可以选择直接回车跳过

最终得到:

  • root.crt : 签名有效期为10年的根证书
  • root.key: 根证书私钥文件
  • root.csr: 根证书请求文件

后面我们可以用这个根证书去颁发服务器证书和客户端证书

2. 根据根证书创建服务端证书

#生成服务器端证书私钥:
openssl genrsa -out server.key 1024

#生成服务器证书请求文件,过程和注意事项参考根证书,本节不详述:
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 3650

通过上面的三个命令,我们得到:

server.key:服务器端的秘钥文件
server.crt:有效期十年的服务器端公钥证书,使用根证书和服务器端私钥文件一起生成
root.srl: CA签发证书的序列号记录文件,全名是 root.Serial 。
server.csr : 服务端证书请求文件(请求证书时使用, 后续配置无用)

3. 根据根证书创建客户端证书

需要注意的是, 可以生成多个客户端证书, 只需安装下面1-4步重新生成即可

#生成客户端证书秘钥:
openssl genrsa -out client.key 1024

#生成客户端证书请求文件,过程和注意事项参考根证书,本节不详述:
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 3650

#生客户端p12格式证书,需要输入一个密码,选一个好记的,比如123456
openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

重复使用上面的三个命令,我们得到:

client.key:客户端的私钥文件
client.crt:有效期十年的客户端证书,使用根证书和客户端私钥一起生成
client.p12:客户端p12格式,这个证书文件包含客户端的公钥和私钥,主要用来给浏览器或postman访问使用
clinet.csr : 客户端证书请求文件(请求证书时使用, 后续配置无用)
 

4. nginx配置

server {
        listen       443 ssl;
        server_name  www.yourdomain.com;# 无域名可填写ip
        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;  #开启客户端证书验证  

		# 反向代理eg: 作用是通过https(443端口)访问, 则会直接去请求本机的8991端口
		 location / {
           	proxy_pass http://127.0.0.1:8991/;
    		  }

		
        #location / {
        #    root   html;
        #    index  index.html index.htm;
        # }
    }

注意:

配置的主要内容是配置了服务器端证书的公钥私钥以及根证书的公钥, 并且ssl_verify_client 参数设置为 on

如果客户端证书不是由根证书直接颁发的,配置中还需要加一个配置:ssl_verify_depth 1;

配置完成后,通过nginx -s reload 令配置文件重新加载, 无需重启

如果手里面只有通过正规途径申请下来的证书(而不是上面自签证做法), 得到的证书如下面所示, 这里只有服务端证书而没有服务端和根证书, 所以仍需要我们以自签证的方式生成根证书以及客户端证书

访问测试

访问方式1:curl带证书访问

   curl --cert ./client.crt --key ./client.key https://xxx.xxx.com -k

访问方式2:postman

1.在设置General中先把SSL certificate verification关掉

在这里插入图片描述

 2.可以Certificates中配置p12文件,p12文件可以认为是一对公私钥的合体文件, 同时也要配置p12文件的密码。注意这里的地址和端口要与实际的一致,否则请求时会认证失败。

在这里插入图片描述

 3.也可以在Certificates中配置客户端公私钥证书。无需配置密码

在这里插入图片描述

 

相关文章:

  • 基于GStreamer和FFmpeg的OpenCV安装和使用
  • 高项 11 风险管理
  • 字节12年测试经验,从零基础软件测试到功能测试到自动化测试到测试开发,我整理了这二份8000字入门到入职的学习指南
  • SQL 为什么历经半个世纪却经久不衰?
  • 【数据结构初阶】八大排序(三)——归并排序计数排序
  • VI 使用技巧
  • Disruptor生产和消费模式详解及高级应用(并行模式)
  • [算法周训 3] 字符串训练2
  • 判断月份所在的季节
  • 大数据毕设选题 - flask疫情数据可视化系统(python)
  • 记录第一次开源流计算框架Flink代码的贡献
  • 共码未来 | 助力实现事半功倍的前端开发体验
  • 客户端存储localStorage和sessionStorage以及Cookie
  • Python学习笔记:Jupyter Notebook快速入门案例:学习时间与成绩的关系
  • 嵌入式软件工程师面试题(三)
  • python3.6+scrapy+mysql 爬虫实战
  • 11111111
  • css选择器
  • Docker: 容器互访的三种方式
  • echarts花样作死的坑
  • javascript 哈希表
  • Java的Interrupt与线程中断
  • Java多线程(4):使用线程池执行定时任务
  • leetcode98. Validate Binary Search Tree
  • Nodejs和JavaWeb协助开发
  • OSS Web直传 (文件图片)
  • Python爬虫--- 1.3 BS4库的解析器
  • Redis 懒删除(lazy free)简史
  • Spring声明式事务管理之一:五大属性分析
  • tweak 支持第三方库
  • TypeScript实现数据结构(一)栈,队列,链表
  • 关于extract.autodesk.io的一些说明
  • 思考 CSS 架构
  • 算法-图和图算法
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • postgresql行列转换函数
  • 阿里云服务器如何修改远程端口?
  • 如何正确理解,内页权重高于首页?
  • ​flutter 代码混淆
  • #HarmonyOS:Web组件的使用
  • ${factoryList }后面有空格不影响
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (SpringBoot)第七章:SpringBoot日志文件
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (转)大型网站的系统架构
  • ***通过什么方式***网吧
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .stream().map与.stream().flatMap的使用