Nginx Https 双向认证
1 基础知识
1.1 单向认证 SSL 步骤
1、客户端的浏览器向服务器传送客户端 SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息
2、服务器向客户端传送 SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书
3、客户利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的 CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的“发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过, 通讯将断开;如果合法性验证通过,将继续进行第4步
4、用户端随机产生一个用于后面通讯的“对称密码”,然后用服务器的公钥(服务器的公钥从步骤2中的服务器的证书中获得)对其加密,然后将加密后的“预主密码”传给服务器
5、如果服务器要求客户的身份认证(在握手过程中为可选),用户可以建立一个随机数然后对其进行数据签名,将这个含有签名的随机数和客户自己的证书以及加密过的“预主密码”一起传给服务器
6、如果服务器要求客户的身份认证,服务器必须检验客户证书和签名随机数的合法性,具体的合法性验证过程包括:客户的证书使用日期是否有效,为客户提供证书的 CA 是否可靠,发行CA 的公钥能否正确解开客户证书的发行 CA 的数字签名,检查客户的证书是否在证书废止列表(CRL)中。检验如果没有通过,通讯立刻中断;如果验证通过,服务器将用自己的私钥解开加密的“预主密码 ”,然后执行一系列步骤来产生主通讯密码(客户端也将通过同样的方法产生相同的主通讯密码)
7、服务器和客户端用相同的主密码即“通话密码”,一个对称密钥用于 SSL 协议的安全数据通讯的加解密通讯。同时在 SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化
8、客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤7中的主密码为对称密钥,同时通知服务器客户端的握手过程结束
9、服务器向客户端发出信息,指明后面的数据通讯将使用的步骤7中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束
10、SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验
1.2 双向认证 SSL 步骤
1、浏览器发送一个连接请求给安全服务器
2、服务器将自己的证书,以及同证书相关的信息发送给客户浏览器
3、客户浏览器检查服务器送过来的证书是否是由自己信赖的 CA 中心所签发的。如果是,就继续执行协议;如果不是,客户浏览器就给客户一个警告消息:警告客户这个证书不是可以信赖的,询问客户是否需要继续
4、接着客户浏览器比较证书里的消息,例如域名和公钥,与服务器刚刚发送的相关消息是否一致,如果是一致的,客户浏览器认可这个服务器的合法身份
5、服务器要求客户发送客户自己的证书。收到后,服务器验证客户的证书,如果没有通过验证,拒绝连接;如果通过验证,服务器获得用户的公钥
6、客户浏览器告诉服务器自己所能够支持的通讯对称密码方案
7、服务器从客户发送过来的密码方案中,选择一种加密程度最高的密码方案,用客户的公钥加过密后通知浏览器
8、浏览器针对这个密码方案,选择一个通话密钥,接着用服务器的公钥加过密后发送给服务器
9、服务器接收到浏览器送过来的消息,用自己的私钥解密,获得通话密钥
10、服务器、浏览器接下来的通讯都是用对称密码方案,对称密钥是加过密的
1.3 常见证书格式
1、 PKCS:Public-Key Cryptography Standards ,是由 RSA 实验室与其它安全系统开发商为促进公钥密码的发展而制订的一系列标准
2、X.509:常见通用的证书格式。所有的证书都符合为Public Key Infrastructure (PKI) 制定的 ITU-T X509 国际标准。X.509是国际电信联盟-电信(ITU-T)部分标准和国际标准化组织(ISO)的证书格式标准。作为ITU-ISO目录服务系列标准的一部分,X.509是定义了公钥证书结构的基本标准。
3、常见证书格式
文件扩展名 | 文件格式 | 含证书 | 含私钥 | 备注 |
---|---|---|---|---|
.der | 二进制 | 是 | 否 | |
.cer | 二进制 | 是 | 否 | |
.crt | 二进制/文本 | 是 | 否 | |
.pem | 文本 | 可选 | 可选 | 只含私钥时可使用.key做扩展名,带密码保护 |
.pfx | 二进制 | 是 | 是 | |
.p12 | 二进制 | 是 | 是 |
2 Example
2.1 生成证书(根证书、服务端证书、客户端证书)
2.1.1 线上:直接购买信任机构签发的服务端证书、客户端证书(可以使用百度安全部签发的证书)
2.1.2 测试:自己生成 根证书、服务端证书、客户端证书
1、根证书
1)创建根证书私钥
openssl genrsa -out root-key.key 1024
2)创建根证书请求文件
openssl req -new -out root-req.csr -key root-key.key
注:国家,省市,公司等需要和后面的证书保持一致,challenge password直接回车即可
3)自签根证书
openssl x509 -req -in root-req.csr -out root-cert.cer -signkey root-key.key -CAcreateserial -days 3650
4)生成p12格式根证书,密码填写123456
openssl pkcs12 -export -clcerts -in root-cert.cer -inkey root-key.key -out root.p12
2、服务端证书
1)生成服务端key
openssl genrsa -out server-key.key 1024
2)生成服务端请求文件
openssl req -new -out server-req.csr -key server-key.key
注:国家,省市,公司等需要和1.2保持一致,common name是服务器域名,本地测试时可通过配置host将ip映射成域名
3)生成服务端证书(root证书,rootkey,服务端key,服务端请求文件这4个生成服务端证书)
openssl x509 -req -in server-req.csr -out server-cert.cer -signkey server-key.key -CA root-cert.cer -CAkey root-key.key -CAcreateserial -days 3650
3、生成客户端证书
1)生成客户端key
openssl genrsa -out client-key.key 1024
2)生成客户端请求文件
openssl req -new -out client-req.csr -key client-key.key
3)生成客户端证书(root证书,rootkey,客户端key,客户端请求文件这4个生成客户端证书)
openssl x509 -req -in client-req.csr -out client-cert.cer -signkey client-key.key -CA root-cert.cer -CAkey root-key.key -CAcreateserial -days 3650
4)生成客户端p12格式根证书(密码设置123456)
openssl pkcs12 -export -clcerts -in client-cert.cer -inkey client-key.key -out client.p12
2.2 Nginx Server配置
server {
listen 80 ssl;
server_name zhanghao61;
ssl on;
ssl_certificate /etc/nginx/cert/server-cert.cer; #server证书公钥
ssl_certificate_key /etc/nginx/cert/server-key.key; #server私钥
ssl_client_certificate /etc/nginx/cert/root-cert.cer; #根级证书公钥,用于验证各个二级client
ssl_verify_client on; #开启客户端证书验证
location /v2x/platform {proxy_pass http://172.24.194.3:8891;proxy_http_version 1.1;proxy_read_timeout 3600s;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header Host $host:$server_port;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";}
}
说明:
1、域名zhanghao61 在host中已配置为映射到本地127.0.0.1
2、服务端证书根据具体使用的证书进行调整
2.3 客户端配置(Chrom为例)
1、直接调用测试接口
2、为浏览器证书管理中导入client.p12和root.p12(可能需要手动信任证书)
3、再次访问测试接口:正常返回
Nginx Https 双向认证相关推荐
- nginx 配置 https双向认证
参考文章: https://blog.csdn.net/xiangguiwang/article/details/76400805 https://blog.csdn.net/qq_37049781/ ...
- 巧用 Nginx 快速实现 HTTPS 双向认证
1.原理 双向认证,顾名思义,客户端和服务器端都需要验证对方的身份,在建立 HTTPS 连接的过程中,握手的流程比单向认证多了几步.单向认证的过程,客户端从服务器端下载服务器端公钥证书进行验证,然后建 ...
- NGINX之HTTPS双向认证
前言 大部分HTTPS的站点都只是单向认证,即只有客户端校验服务端.那么一种更安全的做法则是双向认证,即客户端服务端互相验证. 网上介绍https双向认证原理的帖子很多,就不做赘述! 重要 是否需要双 ...
- HTTPS双向认证(Mutual TLS authentication)
HTTPS双向认证(Mutual TLS authentication) 双向认证,顾名思义,客户端和服务器端都需要验证对方的身份,在建立Https连接的过程中,握手的流程比单向认证多了几步.单向认证 ...
- Nginx的双向认证
Nginx的双向认证 一.前言 参考链接 OPENSSL加密DSA,RSA介绍 客户端默认是相信权威CA机构的,操作系统内置了CA证书. 说白了就是操作系统默认就有了CA证书的公钥,比如我们能访问ht ...
- 证书类型、自签CA证书、https双向认证(一篇就懂系列)
#博学谷IT学习技术支持# 文章目录 1.Linux准备环境 2.证书扩展名 3.自签CA证书 3.1 生成根证书 3.2 生成服务端证书 3.3 生成客户端证书 4.开启https,并校验客户端(双 ...
- linux:Nginx+https双向验证(数字安全证书)
本文由邓亚运提供 Nginx+https双向验证 说明: 要想实现nginx的https,nginx必须启用http_ssl模块:在编译时加上--with-http_ssl_module参数就ok.另 ...
- HTTPS双向认证和如何生成证书
HTTPS双向认证和如何生成证书 HTTPS双向认证和如何生成证书 1.原理 1.1 单向认证流程 1.2 双向认证流程 2.证书生成 2.1 生成自签名根证书 2.2 生成自签名服务器端证书 2.3 ...
- android webview单向认证,android 让webview支持自签名证书https 双向认证(SSL)
最近完成一个项目,安全级别比较高.所以涉及到https双向认证,在网上找了很多资料都没有完美的解决方案.最后参考了org.sandrob.sslexample的实现方式,结合实际情况才完成该技术难题, ...
最新文章
- currency类型_让我们一起走进VBA基本语法的世界,先了解一下数据类型有哪些
- python中if语句中可用break_【第四篇】Python的if语句/for..in循环/while循环/break和continue...
- python下载安装教程3.8.0-Python3.8.0
- POJ 3469 Dual Core CPU(最小割模型的建立)
- java class类文件结构
- 高等数学:第十章 曲线积分与曲面积分(3)高斯共识、通量、散度、斯托克斯共识、环流量、旋度
- 计算机网络阶段,计算机网络的发展大致可分为四个阶段,目前人类进入了()。 - 问答库...
- 容器安装java_在docker容器中安装Java(从宿主机向docker容器中拷贝文件)
- 阿里云服务使用docker安装mysql
- 基于javaweb的宠物医院管理系统
- CentOS安装锐捷认证客户端
- echarts--迁徙图
- jquery html5自动播放,jquery html5 视频播放控制代码
- 文字识别:Tesseract OCR
- Android中ButterKnife的使用
- php快递地址填写,智能识别快递地址api接口实现(PHP示例)
- 查看jvm进程cpu火焰图工具
- http://localhost:8080打不开
- iOS动画之转场动画CATransition
- 《被讨厌的勇气》阅读摘录总结