基础概念
引用自:【亚洲诚信】SSL证书工作原理
这张图还是很通俗易懂,简单的说利用以上步骤传输对称加密的秘钥进行加密传输,但仍然有几个问题
- 我听说过数字签名、证书、CA等一些概念,这些概念和上面的流程图有什么联系
- 我使用过 KeyTool 生成过证书,但是 keystore 是什么,那些生成的 .crt, .pem 还有其他一些奇怪的后缀名文件又是什么
- 我经常看到 “CA 根目录证书不被信任” 这个字样,所以根目录证书是什么,它和我申请的(自签的)证书有什么联系
- 抓包工具是如何抓取并解析 HTTPS 数据包的
- 我需要在 Nginx/Tomcat 等服务器实现安全传输,我该如何安装证书(在线等,急)
第一个问题:可以参考《数字签名是什么?》 一文。参考上图关键在于公钥的校验,因为网络环境可以理解为一个黑箱,对方传给你的证书(其中包含公钥)你并不知晓其发送者是谁,因此需要通过手段验证此证书的合法性。
第二个问题:可以参考《那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)》一文。不过自签证书部署相对麻烦(要给所有访问服务器的客户端添加此证书的信任),如果不是局域网内等特殊环境与要求需要这样做,只是想给你的网站升级,可以通过 FreeSSL.org 这个站点申请免费证书,再通过脚本自动续签证书即可。
第三个问题:好问题见下文(因为部分介绍 HTTPS 的文章没有涉及到这个点)
第四个问题:可以参考《图解 HTTPS:Charles 捕获 HTTPS 的原理》和《浅谈Charles抓取HTTPS原理》。简单的说就是浏览器请求后接收服务器的证书实际上是抓包工具动态生成的证书,因为之前你设置过信任工具生成的证书,因此这一步就没有问题。
第五个问题:可以参考《【亚洲诚信】HTTPS证书如何安装》 一文
证书信任链校验
引用自:《OpenSSL-证书链》一文
一般而言一个完整证书链包含三部分①根证书 ②中间证书 ③客户端证书。一个证书被信任取决于证书链是否完整,也就是是否能通过验证到达可信的根证书。在计算机和浏览器已经默认存在了一些绝对可信的证书称之为根证书。如果一个证书依据信任链能够最终到达根证书意味着此证书可信。所以一个问题就是为何需要中间证书,这里引用【迅通诚信】SSL知识库-中间证书的使用 文中的一个片段,总结起来一共有三点:安全性、可行性、兼容性。
- 保护根证书。如果直接采用根证书签发证书,一旦发生根证书泄露,将造成极大的安全问题。所以目前根证书都要求离线保存,如果需要用根证书签名,则必须通过人手工方式,直接用根证书在线签发证书是不允许的。
- 区分不同类型的产品。针对 DV,OV,EV 等不同类型,不同安全级别的证书,CA 会采用不同的根证书,一来便于区分,二来一旦出现问题,也便于区别处理,降低影响。中间 CA 证书一般都是支持在线签发证书的。
- 交叉验证。为了获得更好的兼容性,支持一些很古老的浏览器,有些根证书本身,也会被另外一个很古老的根证书签名,这样根据浏览器的版本,可能会看到三层或者是四层的证书链结构,如果能看到四层的证书链结构,则说明浏览器的版本很老,只能通过最早的根证书来识别。
如果想要查看某网站的证书链,进入开发者工具,选择Security标签,点击 view certificate即可查看了,下图就是必应搜索主页的证书,证书链为三层结构。