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,一经查实,立即删除!

相关文章

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…

子承父业-C#继承

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

MAVEN创建并打包web项目

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

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

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

[BZOJ2458][BeiJing2011]最小三角形

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

小技巧集锦

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;实现接口类或结构体必须遵守其协定…

JMeter入门(1):JMeter总体介绍及组件介绍

一、JMeter概述 JMeter就是一个测试工具&#xff0c;相比于LoadRunner等测试工具&#xff0c;此工具免费&#xff0c;且比较好用&#xff0c;但是前提当然是安装Java环境&#xff1b;JMeter可以做(1)压力测试及性能测试&#xff1b;(2)数据库测试&#xff1b;(3)Java程序的测试…

根据HTML5 获取当前位置的经纬度【百度地图】【高德地图】

是想让地图的定位用户位置更准确一些。 查看了介绍&#xff1a; http://www.w3school.com.cn/html5/html_5_geolocation.asp 看介绍中拿数据挺简单。 <!DOCTYPE html> <html> <body> <p id"demo">点击这个按钮&#xff0c;获得您的坐标&…

C# delegate与event,委托与事件

文章目录委托示例事件实例博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 委托和事件是C#中两个比较复杂的概念&#xff0c;这篇文章介绍两个概念与基本用法&#xff0c;让大家理解C#中的事件处理机制。 委托 委托也叫代理&#xff0c;就是把…

Java的四种引用,强弱软虚,用到的场景(转+补充)

Q1&#xff1a;引用队列是什么&#xff1f;如何使用&#xff1f;使用的场景有哪些&#xff1f; A1:oracle的api文档的描述&#xff1a; https://docs.oracle.com/javase/7/docs/api/java/lang/ref/ReferenceQueue.htmlReference queues, to which registered reference objects…

C# lambda表达式与匿名方法

文章目录匿名方法Lambda表达式实例实例博主写作不容易&#xff0c;孩子需要您鼓励 万水千山总是情 , 先点个赞行不行 C#中的匿名方法是在C#2.0引入的&#xff0c;它终结了声明委托的唯一方法是使用命名方法的时代。在C#更高版本中&#xff0c;Lambda表达式取代了匿名方法&a…

常用的相似度计算

在数据分析和数据挖掘的过程中&#xff0c;我们经常需要知道个体间差异的大小&#xff0c;进而评价个体的相似性和类别。最常见的是数据分析中的相关分析&#xff0c;数据挖掘中的分 类和聚类算法&#xff0c;如K最近邻&#xff08;KNN&#xff09;和K均值&#xff08;K-Means&…

玩转C#窗体-属性、方法和事件详细说明

文章目录简介Windows窗体的基本属性一、布局属性1、StartPosition属性2、Location属性3、尺寸属性4、WindowsState属性5、Autoscroll属性6、AutoSize属性二、样式属性1、ControlBox属性2、MaximizeBox属性3、MinimizeBox属性4、HelpButton属性5、ShowIcon属性6、Icon属性7、Sho…

for循环和数组练习

//公鸡2文&#xff0c;母鸡1文&#xff0c;小鸡半文&#xff0c;每种至少一只&#xff0c;100文买100只鸡有多少种可能var ci 0; for(var g1;g<50;g){for(var m1;m<100;m){for(var x1;x<100;x){if(g*2m*1x*(0.5)100&&gmx100){ci1;console.log("买公鸡&qu…

c# automapper 使用

一、最简单的用法 有两个类User和UserDto 1 public class User2 {3 public int Id { get; set; }4 public string Name { get; set; }5 public int Age { get; set; }6 }7 8 public class UserDto9 { 10 public string Na…

API设计原则 - Qt官网的设计实践总结

原文链接&#xff1a;API Design Principles - Qt Wiki 基于Gary的影响力上 Gary Gao 的译文稿&#xff1a;C的API设计指导 译文发在酷壳 - CoolShell&#xff1a;API设计原则&#xff0c; 2017-07-25 API设计原则 - Qt官网的设计实践总结 &#x1f34e; 译序 Qt的设计水准在业…

QtCreator5.12.6安装图文教程

前言接触过Qt的同学肯定用过QtCreator,本id最近常用&#xff0c;也就写个教程记录一下安装的过程。可能比较少人学过Qt&#xff0c;感觉Qt还是挺不错的&#xff0c;做出来的界面还算好看&#xff0c;关键是跨平台。说明&#xff1a;安装的系统&#xff1a;win10专业版QtCreator…

H.264学习(一)——帧和场的概念

一、何谓场&#xff1f; 每个电视帧都是通过扫描屏幕两次而产生的&#xff0c;第二个扫描的线条刚好填满第一次扫描所留下的缝隙。每个扫描即称为一个场。因此 25 帧/秒的电视画面实际上为 50 场/秒 (若为 NTSC 则分别为 30 & 60 - 因为我是中国人&#xff0c;因此我采用 P…

RabbitMQ for windows

一、搭建环境 Rabbit MQ 是建立在强大的Erlang OTP平台上&#xff0c;因此安装RabbitMQ之前要先安装Erlang。 erlang&#xff1a;http://www.erlang.org/download.html rabbitmq&#xff1a;http://www.rabbitmq.com/download.html 我目前使用的&#xff1a;http://pan.baidu.c…