nginx ssl 双向认证

一、安装Nginx和OpenSSL

  • yum install nginx openssl -y

二、SSL 服务器 / 客户端双向验证证书的生成

  • 创建一个新的 CA 根证书,在 nginx 安装目录下新建 ca 文件夹,进入 ca,创建几个子文件夹
mkdir ca && cd ca  
mkdir newcerts private conf server

# newcerts 子目录将用于存放 CA 签署过的数字证书(证书备份目录);private 用于存放 CA 的私钥;conf 目录用于存放一些简化参数用的配置文件;server 存放服务器证书文件。
  • conf 目录新建 openssl.conf 文件
[ ca ] 
default_ca      = foo                   # The default ca section 

[ foo ] 
dir            = ./         # top dir  
database       = ./index.txt          # index file.  
new_certs_dir  = ./newcerts           # new certs dir 

certificate    = ./private/ca.crt         # The CA cert  
serial         = ./serial             # serial no file  
private_key    = ./private/ca.key  # CA private key  
RANDFILE       = ./private/.rand      # random number file 

default_days   = 365                     # how long to certify for  
default_crl_days= 30                     # how long before next CRL  
default_md     = sha1                     # message digest method to use  
unique_subject = no                      # Set to 'no' to allow creation of  
                                         # several ctificates with same subject. 
policy         = policy_any              # default policy 

[ policy_any ] 
countryName = match  
stateOrProvinceName = match  
organizationName = match  
organizationalUnitName = match  
localityName            = optional  
commonName              = supplied  
emailAddress            = optional  
  • 生成私钥 key 文件
openssl genrsa -out private/ca.key 2048  
输出
Generating RSA private key, 2048 bit long modulus  
.......+++
.........................+++
e is 65537 (0x10001)  
private 目录下有 ca.key 文件生成。  
  • 生成证书请求 csr 文件
openssl req -new -key private/ca.key -out private/ca.csr  
  • 生成凭证 crt 文件
openssl x509 -req -days 365 -in private/ca.csr -signkey private/ca.key -out private/ca.crt  
private 目录下有 ca.crt 文件生成。  
  • 为我们的 key 设置起始***和创建 CA 键库
echo FACE > serial  
#可以是任意四个字符
touch index.txt  
  • 为 "用户证书" 的移除创建一个证书撤销列表
openssl ca -gencrl -out ./private/ca.crl -crldays 7 -config "./conf/openssl.conf"  
# 输出
Using configuration from ./conf/openssl.conf  
private 目录下有 ca.crl 文件生成。  

三、服务器证书的生成

  • 创建一个 key
openssl genrsa -out server/server.key 2048  
  • 为我们的 key 创建一个证书签名请求 csr 文件
openssl req -new -key server/server.key -out server/server.csr  
  • 使用我们私有的 CA key 为刚才的 key 签名
openssl ca -in server/server.csr -cert private/ca.crt -keyfile private/ca.key -out server/server.crt -config "./conf/openssl.conf"  
# 输出
Using configuration from ./conf/openssl.conf  
Check that the request matches the signature  
Signature ok  
The Subject's Distinguished Name is as follows  
countryName           :PRINTABLE:'CN'  
stateOrProvinceName   :ASN.1 12:'GuangDong'  
localityName          :ASN.1 12:'GuangZhou'  
organizationName      :ASN.1 12:'le****'  
organizationalUnitName:ASN.1 12:'dev'  
commonName            :ASN.1 12:'le***'  
emailAddress          :IA5STRING:'****@gmail.com'  
Certificate is to be certified until Mar 19 07:37:02 2017 GMT (365 days)  
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y  
Write out database with 1 new entries  
Data Base Updated  
注:签名信息每次必须输入一致

四、客户端证书的生成 * 创建存放 key 的目录 users

mkdir users  


* 为用户创建一个 key

openssl genrsa -des3 -out ./users/client.key 2048  
输出:
Enter pass phrase for ./users/client.key:123  
Verifying - Enter pass phrase for ./users/client.key:123  
#要求输入 pass phrase,这个是当前 key 的口令,以防止本**泄漏后被人盗用。两次输入同一个密码(比如我这里输入 123),users 目录下有 client.key 文件生成。
  • 为 key 创建一个证书签名请求 csr 文件
openssl req -new -key ./users/client.key -out ./users/client.csr  
#users 目录下有 client.csr 文件生成。
  • 使用我们私有的 CA key 为刚才的 key 签名
openssl ca -in ./users/client.csr -cert ./private/ca.crt -keyfile ./private/ca.key -out ./users/client.crt -config "./conf/openssl.conf"  
  • 将证书转换为大多数浏览器都能识别的 PKCS12 文件
openssl pkcs12 -export -clcerts -in ./users/client.crt -inkey ./users/client.key -out ./users/client.p12  
输出
Enter pass phrase for ./users/client.key:  
Enter Export Password:  
Verifying - Enter Export Password:  
输入密码后,users 目录下有 client.p12 文件生成。

五、Nginx配置

  • vhosts.xxx.conf 在 server { }段国入如下代码
        listen       443; 
        server_name  localhost; 
        ssi on; 
        ssi_silent_errors on; 
        ssi_types text/shtml; 

        ssl                  on; 
        ssl_certificate      /usr/local/nginx/ca/server/server.crt; 
        ssl_certificate_key  /usr/local/nginx/ca/server/server.key; 
        ssl_client_certificate /usr/local/nginx/ca/private/ca.crt; 

        ssl_session_timeout  5m; 
        ssl_verify_client on;  #开户客户端证书验证 
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDH:AES:HIGH:!aNULL:!MD5:!ADH:!DH;


        ssl_prefer_server_ciphers   on; 
  • 重新启动Nginx

吊销客户端证书
openssl ca -revoke users/client.crt -cert private/ca.crt -keyfile private/ca.key -config "./conf/openssl.conf"
openssl ca -gencrl -out private/ca.crl -config "./conf/openssl.conf"
可通过openssl verify -crl_check -CRLfile private/ca.crl -CAfile private/ca.crt client.crt 验证是否被吊销

六、客户端访问验证

* 这是因为 https 双向验证需要客户端安装证书。拿到生成的客户端证书 client.p12,直接双击它,进入 "证书导入向导": 
导入证书,直接双击下一步,下一步,输入密码,下一步,导入完成。重新打开浏览器测试

  • MAC下需要手动添加为信任钥匙串,并使用safari打开测试

版权声明:本文为my_bai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/my_bai/article/details/76528173

智能推荐

第三方库PNChart的使用

PNChart 是一个强大的带动画的图表库   要是用这个库可以使用pods,也可以直接将库导入项目中,必须引入"PNChart.h"头文件   下面我们来看一下代码!      转载于:https://www.cnblogs.com/aeronfay/articles/4929223.html...

LeetCode刷题笔记(10)-BFS广度优先搜索

LeetCode刷题笔记(10)-BFS广度优先搜索 127、单词接龙 给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则: 每次转换只能改变一个字母。 转换过程中的中间单词必须是字典中的单词。 输入: beginWord = “hit”, endWord = &ldqu...

线性筛选素数的方法及基于线性筛选素数的欧拉函数筛选莫比乌斯函数筛选

欧拉筛法线性求素数 回忆一下经典的埃式筛法求素数。时间复杂度是为O(nloglogn)(我之前一直以为是O(n))O(nloglogn)(我之前一直以为是O(n)) 显然,当一个数是素数的时候,那么他的倍数肯定是合数,筛选标记即可 我们来举个列子 筛选2-10的素数 首先2是素数,然后把其倍数删去,我们标记下删去的次数用一个斜杠表示删去了一次 之后3是素数,继续删去倍数,这个时候发现6被重复删去两...

JEECG 页面多个用户选择器只显示最后一个

在一个页面当中,我们可能会需要有多个的用户选择器进行快速的录入,此时会发现所有的输入都会在最后一个用户选择器的地方显示 查看页面代码当中的ID也是不一致: 查看通过标签生成之后的源码,可以发现所有的用户选择器都会生成一个 点击输入框调用的js方法都是一样的,看到这里也就可以明白为什么都是只有最后一个用户选择输入框当中有数据了。 因此我们对后台当中标签代码生成部分进行改造,让其支持多个用户选择器: ...

力扣47 全排列ii 回溯加剪枝

 这题难点在于先排序,然后重复的数字112 used[i-1]= fase 代表之前我用过了,就是我俩 1前面的用过了现在这一个我就直接跳过去    ...

猜你喜欢

arp协议

arp协议叫做地址解析协议,通常与ip地址共同使用,将ip地址转换成硬件地址(MAC地址)。arp既可以放在网络层,也可以放在数据链路层,因为它做了两层的工作。 当一个主机向另一个主机发送数据报时,通过arp协议,向局域网中发送arp请求,所有在局域网中的主机都可以收到,但会在网络层丢弃,只有一台符合目的ip的主机会发送给源主机arp响应包含自己mac地址,因此源主机就可以向目的主机发送报文。 l...

模拟登陆改版后的知乎(最新版)

今天,想着看看视频,把模拟登陆这一块学习学习,以后弄把梯子,去爬爬FaceBook什么的。就拿知乎练练手吧,可曾想,知乎竟然改版了!!之前的教程书籍对现在的知乎来说,都是扯淡,连页面都找不到了。下面一起谈谈改版后的纸糊的模拟登陆吧。 页面分析 抓包 首先,打开页面:https://www.zhihu.com/signup?next=%2F(登录网址都变了…),F12,输入账号密码(记...

干货分享——比微信域名防封防举报更牛逼的防封方案

从微信兴起到现在,微信的流量就一直居高不下,在淘宝时代和传统的电商时代,只要把广告打出去,别人通过搜索就可以找到我们,所以,移动互联网的到来,在微信爆棚的今天,都想在微信里面推广自己的产品,借力微信,达到客户沉淀,营销宣传,传播影响的目的,可以由于微信种种机制,有人腾讯要维护自身的利益,也有人说是微信要营造一个健康的生态圈,种种限制,比如分享次数过多,域名会被微信拦截屏蔽封杀,还比如微信中的链接不...

mysql的事务提交(java)

个人理解的一个事务:是一个Connection一系列的操作过程,如果是两个Connection连接在操作,那就是两个事务。 事务的前提:数据库的存储引擎是innodb。 事务的目的:保证数据的安全性。 事务安全:  1.自动提交事务:每执行一条sql语句,就同步到数据库中。  2.手动提交事务:执行一系列的sql语句后一起同步到数据库中。 事务的四大特性:  A(at...

使用宏批量修改word中图片大小

                word中使用宏修改图片大小,图片大小相同 1、打开word中视图选项卡,选择“宏”->“输入宏名”->“创建” 2、编辑宏 输入下面...