个人博客

在互联网世界,我们广泛采用 TLS 来保护通信安全,这里的安全主要包含两部分内容:身份鉴别、通信加密。身份鉴别是一切的基础,特别当发送消息比较敏感需要加密时,对接收方必然有一个身份“假设”,“假设”如何证实就是靠鉴别,而鉴别的前提是有一套身份标记规范——如中国的公民身份证、美国的社会保障号。

一切活动都是不同实体间的互动,虚拟世界要运作起来首先也必须建立各种实体,标记其身份,特别是需要和物理世界的实体进行对应时 —— 至于如何对应又是另一个复杂问题,这种映射到物理世界的困难似乎是所有概念的宿命。

整体结构

在互联网世界里,是通过 PKI(Public-Key Infrastructure,公钥基础设施)来建立身份体系,使用的标准为 X.509。在 X.509 中规定采用证书来标记身份(根本上还是非对称加密技术,此处不赘述),并通过相关的参与方来管理证书的整个生命周期。

在 PKI 体系中,主要有 4 个参与方:

  • CA(Certification Authority),证书颁发机构,核心设施,负责颁发、吊销证书;
  • RA(Registration Authority),证书登记机构,在现实中核实申请证书的用户身份,此功能可以合并到 CA 中;
  • 证书申请用户,使用证书来表明自己的合法身份,通常为网站;
  • 终端浏览器,用户通过浏览器访问网站的 https 地址,在建立 tls 会话的过程中获取证书、鉴别网站身份。

通常情况下,只需要单向认证,整个过程如下:

  1. 网站需要先生成证书签名申请(CSR,Certificate Signing Request),主要包含公钥、网站域名(可以有多个),以及私钥对申请信息的签名;
  2. 将 CSR 提交 CA,CA 核实后生成网站证书,颁发给网站;
  3. 网站在 SSL 网关(如 Nginx)上配置证书(如果网站证书往上还有若干中间证书,则最好把中间证书和网站证书都放在一起),启用 https;
  4. 浏览器访问 https 网址,在 tls 握手过程中读取到网站证书;
  5. 查询 CRL(Certificate Revocation List,证书撤销列表)、OCSP(Online Certificate Status Protocol),验证证书的有效性,并从网站证书开始,循着证书链验证每一个节点的证书合法性。

证书

内容

证书就是实体的身份证,里面主要包含了实体的公钥以及 CA 机构的认证签名。

格式

证书有多种存放格式,主要有以下三种:

  • DER(Distinguished Encoding Rules),一种二进制编码格式;
  • BER(Basic Encoding Rules),是 DER 的子集
  • PEM(Privacy-enhanced Electronic Mail),是 DER 经过 BASE64 编码后的格式。

还有一种证书格式为 PFX,给客户端浏览器用的,PFX 文件中除了证书,还包含私钥(在双向认证里证明客户端身份),文件后缀为 .pfx 或 .p12。

申请

有 3 种证书申请类型:

  • DV(Domain Validation),全自动签发,只需要验证域名是申请者所有的就行,一般是发一封邮件给域名管理者,点击确认后即自动签发证书;
  • OV(Organization Validation),人工核验,审核相对严格一点;
  • EV(Extended Validation),弥补 OV 审核的不足,证书审核遵照 Baseline Requirements 里的要求,严格。

当然价格和售后服务也是不一样的,EV 最贵。网站一般用 DV 证书,比如博主用的就是 Let’s Encrypt 上薅的免费 DV 证书。

从对应域名的能力来看,证书又可以分为 4 种类型:

  • 单域名证书,只对应一个具体域名,如 www.chenqing.work;
  • 泛域名证书,对应一类域名,如 *.chenqing.work;
  • SAN 域名证书,对应多个具体域名,一般这多个域名无法合并到一个泛域名下,如 www.chenqing.work、www.chenqing.life;
  • SAN 泛域名证书,对应多个泛域名,如 .chenqing.work、.chenqing.life。

价格上肯定单域名的最便宜,能匹配越多域名的越贵。

关于证书,国内和国际还有一点差异,国际标准一般称为单证,用户使用唯一的一张证书及对应私钥进行签名和加密操作;而国内称为双证,签名的一对公私钥是自己生成,但加密过程中用的公私钥是由 CA 生成。

信任

身份通过证书来唯一标记,那如何验证证书的合法性?如何确认它不是伪造的?

首先来看一下网站证书,证书必须包含的内容之二是:颁发者(issuer)、颁发对象(subject)。结合当前证书的其他相关字段可以确证是该颁发者认证并颁发了证书给颁发对象。这样问题就递进为确认颁发者是不是合法的。

上推一级,去拿颁发者的证书,颁发者的证书中同样具有“颁发者”、“颁发对象”这两项内容,以此类推,就构成了一条证书链,当然链条的每个咬合点都需要使用签名来保障真实性。(猜猜区块链技术有没有借鉴它?)

因为证书不可能无限长,上推到某一节点必须要停止,在该节点“颁发者”、“颁发对象”是同一个,称为根证书,根证书显然为自签名证书。到这里问题就归约为根证书是否合法

根证书怎么验证合法性?通过网络请求 CA 鉴别?

问题是,通过网络请求 CA 进行鉴别前,需要先鉴别自称是 CA 的服务发来的证书是否表明它就是 CA。这就陷入了鸡生蛋还是蛋生鸡的死循环,总之至少要预先共享一点啥。

解决方法还是物理配送,即在操作系统、浏览器中下锚——预置信任的根证书,如此整个信任链条就建立起来了。

所谓互联网上公开受信的证书,就是其根证书在操作系统、浏览器中有预置的证书。所以开发环境自签名证书时,需要将根证书手工导入操作系统或浏览器的受信任根证书区域。


参考

  • 《HTTPS 权威指南》
  • 《Web 性能权威指南》
  • 《深入浅出 HTTPS》

Web 安全:PKI 扫盲相关推荐

  1. SSL协议安全系列:PKI体系中的证书吊销

    GoSSIP_SJTU · 2016/03/03 10:06 0x00 前言 在前面的章节我们讨论了部分SSL/TLS握手协议.记录协议中存在的安全问题,针对它们的攻击以及相应的加固方案.在SSL/T ...

  2. ACM CCS 2020 · web安全研究学者

    ACM CCS 2020 · web安全研究学者 锁一下!最近打算整理下这些学者的论文,然后看一下他们的研究脉络.其他四大也应该锁一下. Giovanni Vigna 学校:University of ...

  3. 你不在意的HTTPS证书吊销机制

    现任美团安全部技术专家,十年以上互联网产品研发经验,专注于分布式系统架构设计,目前主要从事安全防御产品研发工作. 缘起 偶刷<长安十二时辰>,午睡时,梦到我穿越到了唐朝,在长安城中的靖安司 ...

  4. 关于PKI架构(使用证书)保护Web访问的安全实现SSL的基本理论

    当您正在使用电子商务.电子银行转存帐,可能您的Web页面需要经过安全加密处理,那么,此时您就必须用到https,其中的s是secure(安全保护的意思)https是在安全套接层(SSL)之上使用htt ...

  5. PKI证书签发系统(web版)新

    原来的项目进行翻新功能维护 采用新的加密算法和生成证书方式. pki-new 新版本 一个pki证书申请,审核和证书下载安装的管理系统软件,通过调用java自带的工具,将信息存入数据库,同时也是一个学 ...

  6. 《小白WEB安全入门》01. 扫盲篇

    扫盲篇 基础知识 什么是WEB 什么是前端 什么是后端 什么是数据库 什么是协议 什么是WEB安全 什么是服务器 什么是IP地址.端口 什么是局域网.广域网.内网.外网 什么是URL 什么是MAC地址 ...

  7. web字体 衬线字体与非衬线字体区别 字体扫盲

    首先是因为心中有很多问题,这些问题困扰我很久了,这些问题对于一个不是专门做前端的web开发人员来说可能都会有. web可以用什么样的字体? 我特意看了很多网站,包括很多大网站,排名很不错的网站,他们用 ...

  8. 小白扫盲:浅谈web应用在nat123下的vip服务

    nat123是一个IP穿透及域名代理服务,使用它,可以在任何网络下可上网即可搭建自己的服务器,并提供外网服务. nat123可以应用的范围很广,可以适配网站.远程桌面.数据库.SSH访问.办公OA.管 ...

  9. PKI证书签发系统(web版)

    这几天没事干,学校安排小学期做一个pki证书签发系统,班上的学霸美女一组,哈哈!虽然90%的活都是我做的,但是帮帮女生也是可以得嘛!扯远了!看看效果吧!用的是ssh框架做的一个签发证书网站,有普通用户 ...

最新文章

  1. iOS单个应用程序的最大可用内存是多少?
  2. [公告]向大家汇报服务器的情况
  3. MVC小型商务网站实例(2)--项目架构
  4. 【统计学习】假设检验
  5. 成功解决model_selection\_search.py:584: DeprecationWarning: fit_params as a constructor argument was d
  6. Django框架(22.Django中设置session以及session对象及方法)
  7. echarts地图api series_echarts学习(4)——地图实现
  8. 超图Cesium鼠标事件处理
  9. 在ASP.NET Identity 2.0中使用声明(Claims)实现用户组
  10. CAS总结之Ticket篇
  11. 数据结构1800题-错题集-第二章
  12. 城市智能交通项目实施方案
  13. php speex,将微信jssdk录制的speex高清音频转换为wav/mp3
  14. 来成都旅游,千万不要做的22件事!
  15. Android Studio 快捷用法
  16. 高数定理、法则(持续添加)
  17. Java中hashcode和equals详解
  18. 让你的代码只做一件事情
  19. leetcode 416 分割等和子串
  20. 旅行者 问题_旅行者-管理员UI可以使Laravel更加平易近人吗?

热门文章

  1. 生产设备管理指标有哪些?
  2. C语言基础入门48篇_18_使用循环移动游戏人物(屏幕符号运动、while(1){}进行实时响应,if(表达式){},switch(表达式){},windows的API及API进行自行封装使)
  3. shell_day1
  4. Java网络编程UDP编程
  5. R语言 向量排序与运算
  6. linux 强制卸载nfs,linux nfs 卸载
  7. 开发者藏经阁——超全阿里系电子书大合集(打包下载)
  8. RUNTIME / 微信公众号开发—主动向用户发送消息
  9. 基于微信小程序的外卖点餐平台的设计与实现-计算机毕业设计源码+LW文档
  10. 基于SSM医药后台管理系统