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

环境

系统: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

效果:

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

生成CA跟证书

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

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

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

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

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

结果多了两个文件:

生成server端证书

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

openssl genrsa -des3 -out server.key 1024

  

生成证书请求

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

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

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

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

  现在用生成的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

 生成的服务端证书文件: 

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

验证单向认证

配置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配置文件:

  

启动nginx

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

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

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

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

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

 

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

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

生成client证书

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

openssl genrsa -des3 -out client.key 1024

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

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

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

生成客户端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导入浏览器。

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

查看证书信息:

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

   OK!!!

go go go!

附:

最终目录下的文件列表:

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

SSL双向认证的实现相关推荐

  1. php使用curl库进行ssl双向认证

    官方文档: http://www.php.net/manual/zh/function.curl-setopt.php#10692 官方举例: <?php curl_setopt($ch, CU ...

  2. 服务器双向认证 原理,什么叫SSL双向认证 SSL双向认证过程是怎样的

    我们都知道SSL认证能够分成SSL双向认证和SSL单向认证.那么,什么是SSL双向认证?SSL双向认证过程又是怎样的?小编就在接下来的内容为各位详细讲述. 什么叫SSL双向认证 SSL双向认证则是需要 ...

  3. SSL双向认证和SSL单向认证的区别

    双向认证 SSL 协议要求服务器和用户双方都有证书.单向认证 SSL 协议不需要客户拥有CA证书,具体的过程相对于上面的步骤,只需将服务器端验证客户证书的过程去掉,以及在协商对称密码方案,对称通话密钥 ...

  4. HTTPS|SSL笔记-SSL双向认证成功握手过程(含wireshark分析)

    这里只研究连接过程. 整体的流程是这样的 前三个那个SYN.SYN ACK.ACK是TCP三次握手,就不说了. 1. 握手成功后,客户端发送自己支持的加密套,和随机数给服务端,也就是Client He ...

  5. java使用bks双向认证_客户端与服务器SSL双向认证(客户端:Android

    客户端与服务器SSL双向认证(客户端Android-服务端vc)-含源码(一)服务端已经生成了client.p12.server.p12.ca.p12:主要实现客户端过程(二)目录结构(三)客户端注 ...

  6. SSL双向认证和单向认证原理

    一.公钥私钥 1,公钥和私钥成对出现 2,公开的密钥叫公钥,只有自己知道的叫私钥 3,用公钥加密的数据只有对应的私钥可以解密 4,用私钥加密的数据只有对应的公钥可以解密 5,如果可以用公钥解密,则必然 ...

  7. SSL双向认证和SSL单向认证的流程和区别

    refs: SSL双向认证和SSL单向认证的区别 https://www.jianshu.com/p/fb5fe0165ef2 图解 https 单向认证和双向认证! https://cloud.te ...

  8. 什么是SSL双向认证,与单向认证证书有什么区别?

    SSL/TLS 证书是用于用户浏览器和网站服务器之间的数据传输加密,实现互联网传输安全保护,大多数情况下指的是服务器证书.服务器证书是用于向浏览器客户端验证服务器,这种是属于单向认证的SSL证书.但是 ...

  9. Android 10 SSL双向认证握手失败

    Android 10 SSL双向认证握手失败 公司项目前端时间遇到的一个问题(已经解决了),最近有时间准备分享一下. 项目工程中一直使用SSL双向认证的套接字通信方式,前段时间有Android 10的 ...

  10. java客户端带证书访问服务端_客户端与服务器SSL双向认证(客户端:java-服务端:java)...

    客户端与服务器SSL双向认证(java-java):含源码 (一)实现技术: JSSE(Java Security Socket Extension) 是Sun为了解决在Internet上的实现安全信 ...

最新文章

  1. PM Basic Skill---Communicate Plan
  2. 添加chorme插件时出现“程序包无效”
  3. nyoj 202红黑树 (搜索)
  4. Java中通过代理对类进行修改
  5. [蓝桥杯][算法提高VIP]分分钟的碎碎念-dfs
  6. Java EE CDI Producer方法教程
  7. SQL Server同实例下不同数据库表的同步(job实现)
  8. c语言怎么储存字母,c语言怎么用变量存储中文字符?书本上面没有的秘密
  9. 基于Colaboratory平台使用VGGNet网络进行图片分类
  10. mysql_query 资源标识符_PHP mysql_query() 函数解析
  11. 密码学笔记—栅栏密码
  12. 省团团小程序被微信封禁
  13. 现在,让客服接管数字化企业
  14. 关于资金调拨系统的设计方法论
  15. eNSP实验vlan及交换机接口类型配置
  16. 微信小程序创建一个空白页面
  17. 前女友让我撸个植物大战僵尸,我一怒之下把代码开源了...
  18. java qq托盘 消息提醒_如何仿QQ实现托盘闪动消息提醒
  19. 基于BIM+GIS技术,如何构建智慧楼宇三维可视化管控平台?
  20. node.js毕业设计安卓电影院售票管理APP论文(程序+APP+LW)

热门文章

  1. redistemplate注入为null_Windows DLL 注入技术
  2. 使用post访问不到接口_Postman工具使用说明
  3. Unity C# Job System介绍(一) Job System总览和多线程
  4. 【XLL 框架库函数】 TempActiveCell/TempActiveCell12
  5. shell常用命令之curl: -w,–write-out参数详解
  6. PerlRegex堆栈溢出的问题
  7. css3 box-shadow阴影(内外阴影与发光)讲解
  8. java面向对象的特征 —(13)
  9. Ajax — 第六天
  10. 浅谈Floyd的三种用法 By cellur925