最近在研究openssl签发证书,在网上搜索关于openssl的用法、资料等等,总觉得非常分散,而且讲得比较浅,文章虽然不少,但是缺少真正能给你讲的明白得,仅停留在“能用”上,感慨一下,这怎么行,到底是大家也不明白还是秘而不宣呢?

前期建议简单了解下:

tls的概念、单向认证和双向认证过程和区别、数字证书、CA机构的角色、openssl

1、你是否需要多层证书?

这里面有两个核心的问题:

a、你是否需要双向认证?

我见过的商业案例,客户公网访问某个服务,直接自己签发一个证书,放在服务端,客户https访问也没啥毛病,客户也不怎么在乎。但是如果你的后台服务是给其他公司提供一个接口,而且客户要求双向认证呢?你光有服务端证书那能行么?

b、你是否需要多级?

还是上面的例子,我的后台给客户的后台双向认证,我可以自建一个根证书,根证书直接签发服务端和客户端证书,到时候服务端证书给我自己,客户端和根证书交给其他公司,也可以实现啊?为啥你还需要多级?

2、为啥要有多级证书?

我也不知道理论怎么分析,大概有几点说法:a、根证书作为最权威、最需要保密的证书,一定要离线保证其安全性,因此只暴露中间层证书,这样即使中间证书不慎丢失,也能重新建设新的中间层证书。b、并且作为国际互联网互相认同的证书,如果全都是一个根证书去签发一套产品的客户端服务端证书,那要有多少个根证书?太多了,管不过来了。c、规范,规范,还是tmd规范!你的多级证书管理起来,把安全性吹一吹,不失为一个技术门槛,让你的竞争对手无奈摇头。

另外一个角度,从结果看:目前打开浏览器看看证书,不都是多级证书么?有的还是4级,也不管为啥了,反正实际商业应用中就是这么搞得。

3、多级证书能用什么方式签发?

无非就是openssl或openssl的封装,说下优劣:

使用原生openssl:

优势:功能可自定义,能力天花板高,用好了甚至可以写到简历上

劣势:需要对证书有一定的了解、需要对openssl的配置文件有了解

基于openssl的封装:例如easyrsa或xca

优势:操作简单,不需要太高的专业知识,简单场景对新手比较友好

劣势:不能批量操作,自定义程度差,难以集成

看完了优势劣势,结果显而易见,还是老老实实用原生openssl,虽然难了一些,谁让你的老板花钱雇你研究这个呢?大概研究个1个月就行了,不过最好能翻Q去goo9le一下。CSDN现在的质量越来越差了。

4、多级证书是如何在企业应用中使用的(用户场景)

产品侧:

多级证书常用结构如:根证书——中间层证书——服务端/客户端证书,这里的“A——B”表示“A是B的上层证书”或者“A签发了B”

这是具体的证书里面的结构,而对于签发主题,结构是:权威顶层CA机构——中间CA机构——客户端/服务端。这里的“A——B”表示"A负责审核B的信息并确认是否应该签发B的证书"

我们的产品里面最终用的不是根证书和中间层证书,最终交互和验证的是客户端和服务端证书,顶层证书和中间层证书都是为了辅助验证表示“确实有一个权威机构认识你们两个(客户端和服务端)的证书的”。

市场侧:

公网安全访问:如果你公司的产品想在公网上被安全访问,例如HTTPS,那么就需要把你公司的证书拿到权威机构(如Global Sign)去认证一下,权威机构会拿自己的私钥在你的证书上签个字(Global Sign赚的就是这份钱),拿回来的材料就是你的服务端证书,未来客户通过https访问你公司的产品后台,你的后台在握手阶段会先把这个证书发送给客户,客户的电脑在出产时已经安装了权威机构的根证书,客户的浏览器用自己的公钥去验证证书,验证此这证书确实由预置在自己电脑中的根证书签发的,那么这个证书就是有效的,这就完成了服务端证书发给客户端的证书的验证。

服务端安全访问:这个指的是后台服务之间的安全访问,服务之间也需要安全访问,那么多级证书的认证就是一个技术门槛,这个前面提到了,就不说了(我们海外的项目就有这种要求)

5、如何签发多级证书?

我就不说具体操作了,这个文章的意义不在于此,而是和大家交流下大家在建设自己的CA方案的时候遇到的问题。

我自己反正是是自签根证书、根证书签发中间层证书,中间层证书签发客户端、服务端,写了个shell,把openssl的命令行封装了一下,否则每次都需要手动去敲,太麻烦了。

网上能搜到一些建设多级证书的方案,但是有些命令明明就是错的,但是大家都是在摸着石头过河,确实没办法判断出自己签发出来的证书是不是符合要求,你怎么和你的领导说“我做完了”?到时候临使用了,突然发现证书不能用,找问题又没有定位的手段,太被动了。

这里我推荐一个视频,在外网上,自己翻墙去看(必看):

https://www.youtube.com/watch?v=d8OpUcHzTeg&list=PLkHWn6amxm3v1HomqB7RxkhQxTNDm_YkF&index=1&t=1371shttps://www.youtube.com/watch?v=d8OpUcHzTeg&list=PLkHWn6amxm3v1HomqB7RxkhQxTNDm_YkF&index=1&t=1371s

6、证书链是什么

网上都在说证书链,到底是个什么,我看也没有讲清楚,证书链有两种理解方法:

a、广义上理解,由于证书的签发关系形成了一条链,而且后续的验证时是从末端逐级向上验证的,最终发现根证书是我们预置且可信的,因此就把这条链称为“证书链”,网上说的大部分证书链都是广义的证书链。

b、具体理解,证书链就是个文件,现在无论是java的框架、curl参数、openssl客户端工具,都会让你指定一个证书文件,那么这个证书文件应该是个证书链,如何制作,很简单,只要把一个证书文件追加到后面一个证书就可以了,这就是证书链。但是用什么证书、哪个证书在前?都是有讲究的。后面第8个问题我们再展开。

7、多层证书生成后时什么样子?

得到几个文件:

根证书相关:root.crt、root.key

中间层证书相关:intermediate.crt、intermediate.key

客户端证书:client.crt、client.key

服务端证书:server.crt、server.key

8、如何验证这些证书的有效性?

可用的工具有:

服务端:使用nginx开启双向认证功能、openssl的s_server工具、网上找的C写的基于openssl的服务端、java现成的包,python的ssl包自己实现。

客户端:curl工具、openssl的s_client工具、网上找的C写的基于openssl的客户端、java现成的包、python的ssl包自己实现。

具体的命令不说了,照着网上的命令详解或者文档都或多或少很快弄明白。下面说下证书链的问题,这些工具服务端、客户端几乎无一例外都要有三个参数:

参数 名称 作用
CAfile(也有叫cacert的) 信任机构证书 根证书,验证证书是否是权威机构签发的
cert 客户端/服务端证书 用于在ssl握手阶段进行交换验证的证书
key 客户端/服务端私钥 用于加密用于对称加密的密钥

问题在于,cafile是谁?cert是谁?key是谁?

先说我的结论:“key必须与cert中第一个证书配套cert可能是server.crt+intermediate.crt或server.crtcafile可能是intermediate.crt+root.crt或root.crt”,分别讲一下:

key必须与cert中第一个证书配套

如果cert是server.crt,那么key就是server.key这个很容易理解,如果cert是server.crt + intermediate.crt,那么就一定要是intermediate追加到server的后面,这样服务才能正常启动。

cert可能是server.crt+intermediate.crt或server.crt

cert为server.crt的情况,就如前面我贴的那个视频教程,服务端使用openssl s_server,指定CA文件为intermediate.crt,cert是server.crt,key是server.key,客户端使用curl未指定证书,但是由于他手动把root.crt添加到linux系统中的信任锚中,因此相当于在客户端指定了root.crt,但是注意,他如果未指定客户端证书,那他的这次通讯肯定是单向认证的。

server.crt+intermediate.crt的情况,如这个视频教程的最后一个演示,服务端使用nginx,指定CA文件为root.crt,cert是server.crt+intermediate.crt,key是server.key。客户端仍然是curl,仍然是单向认证。

cafile可能是intermediate.crt+root.crt或intermediate.crt

我在网上也看到了一个不错的C实现的客户端、服务端,我把链接贴出来

Openssl实现双向认证教程(附服务端客户端代码) - 云+社区 - 腾讯云最近一份产品检测报告建议使用基于pki的认证方式,由于产品已实现https,商量之下认为其意思是使用双向认证以处理中间人形式攻击。https://cloud.tencent.com/developer/article/1726029自己上去取代码,这份代码,是双向认证的,服务端启动时,CA文件必须指定为intermediate.crt+root.crt,cert文件为server.crt,key文件为server.key。客户端启动时,CA文件必须指定为intermediate.crt+root.crt,cert文件为client.crt,key文件为client.key。

另外,使用openssl s_server和s_client,也是这样指定的,我顺便吧命令贴一下:

openssl s_server -accept 443 -key server/private/server.key -cert server/certs/server.crt  -CAfile intermediate/certs/intermediate_root.crt -state -WWW
openssl s_client -connect 127.0.0.1:443  -CAfile intermediate/certs/intermediate_root.crt -cert client/certs/client.crt -key client/private/client.key -showcerts 

对于指定CAfile为intermediate.crt的,目前只发现了在linux下的curl的单向认证场景可以。

结束语:

踩着坑过来的,还是得多试才行,后面有空再加一点关于证书吊销相关的内容吧

浅谈基于openssl的多级证书,Multi-level CA的签发和管理,以及双向认证相关推荐

  1. catia三维轴承_浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文

    浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文 一.概述 单排四点接触球转盘轴承是一种能够同时承受较大轴向负荷.径向负荷和倾覆力矩等综合载荷,集支承.旋转.传动.固定等多种功能于一身的特殊 ...

  2. 浅谈基于软交换的下一代网络技术

    浅谈基于软交换的下一代网络技术 随着产业界的融合趋势,电话网.计算机网.有线电视网趋于融合,网络面临的负荷在不断增大,业务需求也趋于多样化,运营商必须提供越来越多的多媒体业务才能吸引住用户,如何建设一 ...

  3. 计算机网络环境中学科教学,浅谈基于计算机网络环境下的农村小学的科学学科教育...

    浅谈基于计算机网络环境下的农村小学的科学学科教育 [内容摘要] <国家中长期教育改革和发展规划纲要(2010-2020年)>明确提出:加快教育信息化进程.重点加强农村学校信息基础建设,缩小 ...

  4. 浅谈基于SDL的2D纵版弹幕射击游戏相关经验心得

    浅谈基于SDL的2D游戏开发相关 前言:本人才疏学浅,大一新生一枚   写这篇文章的目是为了跟大家分享下自己的一些经验. 进入正题:首先本文这一切的一切都是基于SDL开发WINDOWS平台上的游戏.如 ...

  5. matlab单相电源在哪里,浅谈基于MATLAB的单相独立光伏逆变电源电路仿真设计

    156电子技术 独立型光伏发电系统系统结构如图 1 所示,主要有太阳电池组件(方阵).控制器.储能蓄电池(组).直流 / 交流逆变器等部分组成.光伏阵列发出的直流电通过器将其逆变为交流电供给负载,蓄电 ...

  6. 集 承 享——浅谈基于内容的全链档案管理与服务

    2022年4月16日,由中国人民大学电子文件管理研究中心.中国人民大学信息资源管理学院主办的第十二届"中国电子文件管理论坛"成功在京举办.已举办十二届的该论坛是中国电子文件管理领域 ...

  7. 浅谈基于Internet的多媒体教学系统结构

    [摘 要摘要:基于Internet的多媒体教学系统是一个由硬件.软件.教学内容.教学管理机构组成的一体化有机的系统.本文从系统物质基础.教学系统支撑平台.学生如何进行学习.如何实际开展教学工作四个方面 ...

  8. 基于openssl和国密算法生成CA、服务器和客户端证书

    参考链接 国密自签名证书生成_三雷科技的博客-CSDN博客_国密证书生成 openssl采用sm2进行自签名的方法_dong_beijing的博客-CSDN博客_openssl sm 前提说明 Ope ...

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

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

最新文章

  1. 【转】对random_state参数的理解
  2. Bash scripts
  3. Android NDK学习笔记6:异常处理
  4. 浅析C++ Compile-time Assertion技术
  5. mysql创建索引以及进程过程中出现的问题
  6. VisualSVN https 钩子失效 关闭服务器信任
  7. android app 架构设计_这些冷门的App,好用到为你打开新世界大门
  8. SDN免费快速获得积分和直接获取下载码的几个办法,亲测有效区
  9. MySQL春节收支表怎么建立_怎样才能建一个收支表格?
  10. App 测试工具大全,收藏这篇就够了
  11. 第九届蓝桥杯省赛b组c/c++
  12. 模态逻辑(1)——从命题逻辑开始
  13. Java 基础.JDK 和 JRE 有什么区别
  14. WIN32下使用DirectSound接口的简单音频播放器(支持wav和mp3)
  15. python枪械_Python的七种武器
  16. 2023河北工业大学计算机考研信息汇总
  17. 一本看到技巧又能保持阳光心态励志书(来自苏鹏的推荐)
  18. php语法难看,PHP语法之令人困惑的strtotime
  19. 乐优商城部署配置过程
  20. 栅格影像WGS84转CGCS2000坐标系

热门文章

  1. CAD中插入外部参照字体会变繁体_为什么CAD图纸作为外部参照插入后有些文字消失?...
  2. C/C++订餐管理系统
  3. 误差反向传播的C++实现
  4. DYNAMIC MOVEMENT PRIMITIVES PART 1: THE BASICS
  5. 用AI「复活」逝者:「深度怀旧」项目火遍推特,我们也用民国老照片试了下 #蚂蚁呀嘿
  6. electron静默打印v_13,webview方式的相关配置
  7. 移动硬盘读不出来,无法识别的6种修复方法
  8. win10总显示打印机未连接服务器,win10安装打印机一直未响应。。。
  9. 是对计算机系统或其他网络设备进行,计算机信息系统是由计算机及其相关的和配套的设备、设施(含网络)构成的,按照一定的应用目标和规则对信息进行()等处理的人机系统。...
  10. RTL设计与编码指导