SSL双向认证的实现

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

 环境

系统:archlinux/centOS

nginx:nginx/1.12.2

浏览器:火狐firefox

 前提:1.安装nginx。

       2.安装openssl。

生成证书

新建工作目录

 首先建立一个工作目录,这里以我的工作目录为例。(/home/yinghui/ssl/demoCA-my/),然后执行如下命令。建立生成证书的路径文件结构,这是由openssl的默认配置文件决定的。你可以修改配置。

mkdir demoCA-my
cd demoCA-my
touch ./{serial,index.txt}
echo '01'  > serial
mkdir ./newcerts

配置 openssl.cnf

    拷贝配置文件到工作目录。当然前缀路径要换成你自己的。

cp /usr/local/ssl/openssl.cnf   ./

 修改配置文件。编辑openssl.cnf中的一些选项。

  unique_subject  = no   (这样一个CA可以同时签多张证书)

  countryName = optional(把这些参数的匹配规则改为可选)

  stateOrProvinceName = optional

  organizationName  = optional

  organizationalUnitName  = optional

效果:

  a0b2115381a5d8bef9b2386029f2ab5dd50.jpg

修改dir配置:注意是CA_default 下面的dir

 246834e8a3c7d3d68fd1b339f1622bec835.jpg

生成CA跟证书   

 现在我们来生成自己的CA跟证书

openssl req -days 365 -new -x509 -keyout ca.key -out ca.crt -config openssl.cnf

  生成会话会让你填入一些参数,根据实际情况填写。执行完会发现工作目录下会有ca.crt  ca.key两个文件。截图如下:

204903253925f765be1c27f06078fbe17f7.jpg

    大概说明一下上面各项的意思: 

输入项解释
AU国籍cn
state or province州 省份beijing
Lcality Name城市bj
O name(简写)公司jinxi
O  U name(简写)组织jinxi360
common name通用名网址或者你的名字
Email你的邮箱

结果多了两个文件:

5d1fc95315d7e0ff9e2f1b1ca66fd511cef.jpg       

生成server端证书

  首先生成server端私钥。执行后会要求输入解析私钥文件的密码。生成server.key。

openssl genrsa -des3 -out server.key 1024

3fc8951670d6ad30c1e011e5118d90180c8.jpg  

生成证书请求

    生成会话会提示输入一些请求信息,成功后生成server.csr

openssl req -new -key server.key -out server.csr -config openssl.cnf

8c012c6f008d1d129a7fbf99d6bf705d6ff.jpg

  注意上图中画线的一行,这行输入server端的域名(或者IP地址),这里是https://192.168.1.100 。否则签发的服务端证书会被浏览器视为不是本站点的证书,最后两项我这里直接回车。其他参考上面的解释。

       执行后多出一个文件server.csr

 8041f2aadebd14e1bc6c9ca31e8ede99758.jpg

  现在用生成的CA给证书请求(server.csr)签发证书(crt文件)。根据提示输入相关密码(之前设置好的)和两个 y(yes)回车,成功后生成证书server.crt

openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -config openssl.cnf

 生成的服务端证书文件: 

    1617c1d588d0c9ba6e325634e4bb50533bf.jpg

        到这里,我们已经可以做单项认证了,来试试。

验证单向认证

            配置nginx:vi /usr/local/nginx/conf/nginx.conf修改配置如下图(注意证书和CA的路径是我的工程路径):

server {listen 443;#server_name abc.jinxi360.com;ssl                  on; ssl_certificate       /home/yinghui/ssl/demoCA-my/server.crt;  #服务端证书ssl_certificate_key   /home/yinghui/ssl/demoCA-my/server.key;  #服务端私钥ssl_client_certificate /home/yinghui/ssl/demoCA-my/ca.crt;     #跟CA证书ssl_session_timeout  5m;ssl_verify_client on;  #开户客户端证书验证ssl_prefer_server_ciphers   on;#add_header Strict-Transport-Security 'max-age=31536000';#access_log /var/log/nginx/adm_access.log;#error_log /var/log/nginx/adm_error.log;location / {root html;index  index.html index.htm;}  }

保存后验证 nginx.conf配置文件:

8e375dd6775d929b3ae45176b9b4a1d0881.jpg  

启动nginx

会要求输入server端私钥文件解析密码,输入生成时设置的密码。

b63dbbbbfac56f2ef4c73a4afb546f4c602.jpg

   在windows下打开firefox输入https://192.168.1.100回车。

df6325db7873a7e4f0e6474c68804eedba3.jpg

  这说明nginx已经向浏览器发送了自己的证书,但是这个证书不受信任。别急,现在我们把之前自己的CA导入浏览器。

  打开 选项->高级->查看证书->证书机构->导入。先择CA后根据提示导入证书。成功后如下:

47214937fcbf196731a56d732fdf26d1bd6.jpg

  再次输入https://192.168.1.100回车。

 1ad858433355316ca2739ee50ca763891e2.jpg

  看见中间那行提示了吗?中式英语翻译过来就是-->没有要求的ssl证书来发送。也就是说,client已经成功认证了server端的证书,但是我们配置nginx为双向认证,所以nginx要求浏览器出示证书,而浏览器没有证书。

  说明单项认证已经OK,现在为client生成证书。

生成client证书

  首先生成client端私钥,执行后会要求输入解析私钥文件的密码,根据个人喜好设置。生成client.key。

openssl genrsa -des3 -out client.key 1024

0c893e3e017a987595381a0c3ab8fb2af25.jpg    

    生成证书请求。生成会话会提示输入一些请求信息,成功后生成client.csr。

openssl req -new -key client.key -out client.csr -config openssl.cnf

ffd2268951a86e92a72581ca8386eaf55ed.jpg

        上图中画线的是证书在浏览器中显示的名字,这里使用域名地址作为证书的名称,上面最后两项我直接回车。

生成客户端crt证书:  

现在用之前生成的CA给证书请求(client.csr)签发证书。根据提示输入相关密码(之前设置好的)和y(yes),成功后生成证书client.crt

openssl ca -in client.csr -out client.crt -cert ca.crt -keyfile ca.key -config openssl.cnf

生成p12证书:   

firefox要求客户端的证书格式是p12格式,所以我们把client.crt转化为client.p12格式

openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

   转pem格式

cat ca.crt ca.key > ca.pem
cat server.crt server.key > server.pem
cat client.crt client.key > client.pem

    最后一步,把client.p12导入浏览器。

  打开 选项->高级->查看证书->您的证书->导入。根据提示导入,导入成功后如图:

3cb3ebced632c852dc3777c8daf3917db58.jpg

查看证书信息:

9b35a2006588619cb619b8825d58ab64407.jpg

  输入https://192.168.68.173:8080回车。

 

   OK!!!

go go go!

 

附:

    最终目录下的文件列表:

75da7c3cca902ef1496a94cddfa123914ac.jpg

 

 

转载于:https://my.oschina.net/iyinghui/blog/1832914

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/254296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

partial 分部类-庞大类的瘦身计划

文章目录使用情况语法博主写作不容易,孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 一般来说,一个类、结构或者接口位于一个源文件中,但是某些情况,比如大型项目、特殊部署时,可能需要把一个类、结构或者接口放…

scroll-view——小程序横向滚动

这是官方给的布局代码 <view class"section"><view class"section__title">vertical scroll</view><scroll-view scroll-y style"height: 200px;" bindscrolltoupper"upper" bindscrolltolower"lower"…

二期设计

电子锁管理 设备管理 设备管理 1 信息编辑;回收电子锁发放 电子锁初始化&#xff0c;发放 4 记录车辆在发车时使用的电子锁电子锁开锁联系人管理 电子锁开锁联系人管理 1 根据订单路线中的投点&#xff0c;设置每个投递点的开锁联系人&#xff0c;通过短信的方式下发给你开…

音视频同步系列文章之------时间戳与时间尺度(time scale)

根据一些文章我自己推敲了一下几个概念如下&#xff1a; 采样频率是每秒钟抽取声波幅度样本的次数。8000 帧率是每秒显示帧数。 20 时间戳单位&#xff1a;时间戳计算的单位不为秒之类的单位&#xff0c;而是由采样频率所代替的单位&#xff0c;这…

30秒无需编码完成一个REST API服务

JSON Server 30秒内无需编码快速完成一个模拟的REST API服务。 这个服务主要是给那些需要快速的模拟原型后端接口的前端人员使用的 GitHub&#xff1a;github.com/typicode/js… 安装 $ npm install -g json-server 复制代码Example 新建一个 db.json 文件 {"posts":…

namespace-C#命名空间

博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 C#程序是利用命名空间组织起来的。命名空间既做程序的内部组织系统&#xff0c;又用做外部组织系统。就像一个国家为了便于管理&#xff0c;分成多个省份一样。 声明命名空间 命名空间是.NET …

NKU 专题一 题解

A - Flip Game 总的情况数只有2^16次方种&#xff0c;显然直接bfs就可以了 1 #include<iostream>2 #include<queue>3 #include<cstring>4 using namespace std;5 int W,B,start;6 bool have[1000000];7 struct plot{8 int n,step;9 }; 10 void input(int…

僵尸进程(转)

前面的文章中&#xff0c;我们已经了解了父进程和子进 程的概念&#xff0c;并已经掌握了系统调用exit的用法&#xff0c;但可能很少有人意识到&#xff0c;在一个进程调用了exit之后&#xff0c;该进程并非马上就消失掉&#xff0c;而是留下一个称为僵尸进 程&#xff08;zomb…

ComblockEngine 引擎实践

comblockEngine 参考资料 官方网址 学习备注 熟悉内容 1.python 的字符串操作 2.flags 属性的作用域 flags等 问题每天 1 1.基本数据类型 基本类型 2.数据库表的操作 操作1 3.属性的定义在.def中。self.出来之后&#xff0c;在继承多个类的时候会不会重复。应该是子类的属性覆盖…

王阳明诗歌集

此心光明&#xff0c;夫复何求。&#xff08;王阳明死前对弟子的遗言&#xff09; 0. 非常少年、非常父子 山近月远觉月小&#xff0c;便道此山大于月。若人有眼大如天&#xff0c;当见山高月更阔。—— 《蔽月山房》&#xff0c;作于12岁&#xff1b;1. 中秋 吾心自有光明月&a…

子承父业-C#继承

文章目录继承的定义和使用实例继承的特性继承的可传递性继承的单一性继承中的访问修饰符base和this关键字basethis实例博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 继承是软件复用的一种形式。使用继承可以复用现在类的数据和行为&#xff…

MAVEN创建并打包web项目

maven项目是由一个maven project和多个maven module组成的&#xff0c;以下简介一下maven webapp的创建和打包&#xff0c;前提是你已经安装配置好maven了。打开eclipse。依照例如以下操作&#xff1a; 我们首先当然要先创建一个project。如上图选择。 如今maven project已经创…

GNU gcc的编译工具用法(转)

对大多数不从事Linux平台C语言开发的人来说&#xff0c;GNU gcc的一套工具和Linux平台的共享库的使用还是十分陌生的&#xff0c;其实我也不太熟悉&#xff0c;姑且写点基础知识&#xff0c;权当做备忘吧。 一、GNU gcc的编译工具用法 我们先来写一个简单的C程序&#xff1a;…

学界 | CVPR 2018颁布五大奖项,何恺明获年轻学者奖

年度计算机视觉和模式识别盛会CVPR&#xff08;Conference on Computer Vision and Pattern Recognition&#xff09;在美国盐湖城开幕啦&#xff01; 据统计&#xff0c;本届大会有超过3309篇大会论文投稿&#xff0c;接收979篇论文。 面对如此多的论文评审任务&#xff0c;CV…

virtual、override-蝌蚪和青蛙-C#多态

文章目录多态的概念多态的实现方法重载、重写、隐藏重载重写隐藏博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 多态的概念 什么是多态&#xff1f; 多态一次最早用于生物学&#xff0c;指同一种族的生物具有不同的特性。比如青蛙小时候是蝌…

jvm--3.内存管理

5.JVM内存管理 JAVA虚拟机在执行java程序的过程中&#xff0c;会把它管理的内存分成若干个不同的数据区域。 ------------------------------------------------------------------------------------— | 运行时数据区 | | ----------- -------- ----------------- | | | 方法…

[BZOJ2458][BeiJing2011]最小三角形

题目描述 Description Xaviera现在遇到了一个有趣的问题。平面上有N个点&#xff0c;Xaviera想找出周长最小的三角形。由于点非常多&#xff0c;分布也非常乱&#xff0c;所以Xaviera想请你来解决这个问题。为了减小问题的难度&#xff0c;这里的三角形也包括共线的三点。 输…

Makefile中的变量

Makefile中的变量 2007-11-03 12:03Makefile中变量有以下几个特征&#xff1a; 1. Makefile中变量和函数的展开&#xff08;除规则命令行中的变量和函数以外&#xff09;&#xff0c;是在make读取makefile文件时进行的&#xff0c;这里的变量包括了使用“”定义和使用指示符“d…

小技巧集锦

2019独角兽企业重金招聘Python工程师标准>>> jackson JsonDeserialize 使用方法&#xff1a; 实现方法注解写在set方法上。 public class CustomJsonDateDeserializer extends JsonDeserializer<Date> {private SimpleDateFormat datetimeFormat new SimpleD…

interface-C#接口-统一的标准

文章目录接口的定义接口的实现实例1实例2接口的继承博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 接口是面向对象编程的一个重要技术&#xff0c;在C#中负责实现多重继承。一个接口定义一个协定&#xff0c;实现接口类或结构体必须遵守其协定…