看一遍忘一遍,还是自己写一遍,看看这次能记多久。
在TLS握手过程中,通过证书校验认证服务端的身份和交换加密秘钥,握手完成之后后续就可以进行加密数据传输。
在浏览器地址栏上点击锁的图标,能打开查看证书的详细信息。
首先可以看到证书包含了多个层级,最下层的是我们直接访问的网站的服务证书,最上层是根证书。每个证书都属于一个机构组织。除了根证书是由根CA自己签发给自己的,其他证书都是由上一级组织用上一级的证书签发出来的,所以形成了层级结构。
点开细节可以看到证书的更多信息,主要看证书包含什么信息?
- 签发机构,证书是哪个机构签发的
- 持有机构,使用证书的机构
- 证书有效期
- 证书持有者公钥,用于解密下一级证书或者用于传输加密
- 指纹哈希算法,对证书内容计算哈希,生成指纹
- 证书指纹,对证书内容做哈希,用于验证证书没被修改过
- 证书签名,使用签发机构的私钥对指纹加密生成签名,非对称加密用于安全认证
- 证书签名算法
假设证书链是根CA颁发证书给中间CA,中间CA给网站颁发服务证书,验证过程是怎么样的?
- 客户端访问网站,收到服务证书
- 服务证书的颁发机构是中间CA,在验证服务证书前要验证中间CA,于是先验证中间CA的证书
- 中间CA的证书由根CA颁发,根CA的根证书内置在浏览器或操作系统中,所以根证书不用验证,可以直接信任
- 用根证书中的公钥解密中间CA证书的签名,拿到中间CA证书里的指纹,和计算出的指纹对比,一致则说明中间CA证书可信
- 用中间CA证书中的公钥解密服务证书的签名拿到指纹,和直接计算的指纹对比,一致则服务证书可信
- 服务证书可信,则证书上的信息是对的,接着检查持有机构是不是要访问的站点,证书有没有过期等
- 至此,验证了访问的站点服务是可信的,继续后续TLS握手过程
说起来是不是很抽象,使用baidu证书走一遍验证的流程。这里我执行命令的系统是Ubuntu。
1. 获取证书文件
可以看到返回了三级证书,分别对应depth从0到2
openssl s_client -showcerts -connect www.baidu.com:443 </dev/null > baidu.pem
depth=2 OU = GlobalSign Root CA - R3, O = GlobalSign, CN = GlobalSign
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign RSA OV SSL CA 2018
verify return:1
depth=0 C = CN, ST = beijing, L