数字证书里面有什么
数字证书通常还包括对象的公开密钥,以及对象和所用签名算法的描述性信息。任何人都可以创建一个数字证书,但并不是所有人都能够获得受人尊敬的签发 权,从而为证书信息担保,并用其私有密钥签发证书。
一个网站的证书是由权威机构CA颁发的,所以网站的证书包括了:
- Web 站点的名称和主机名;
- Web站点的公钥
- CA的名称和CA的签名算法
- 证书的序列号和版本号
- 证书的有效期和其他扩展信息
- CA用自己的私钥对上述信息的签名
CA签名过程
CA把站点的信息和证书有效时间和自己的信息使用hash算法生成一个摘要,CA用自己的私钥对这个摘要进行签名,生成的数字签名和原来的信息打包成一个证书。
hash函数如何商量的?
之前强调了证书的内容还包括证书的签名算法,这个签名算法其实就是hash函数。
HTTPS请求过程
先上图
浏览器请求站点的443端口,携带了TLS版本和自己本地支持的加密算法和哈希算法的密码套件,同时还发了一个随机数 Client Random,站点可以从这些密码套件选一个自己有的进行后续的加密和哈希。
-
服务器收到请求,确认TLS版本号,选择浏览器支持的加密和哈希的密码套件,同时也发了一个随机数Server Random给浏览器。
这两个随机数是后续作为生成「会话密钥」的条件,所谓的会话密钥就是数据传输时,所使用的对称加密密钥。
服务器将自己站点的数字证书返回给浏览器。
-
浏览器验证数字证书是否合法,这一部分是浏览器内置的 TSL 完成的,而浏览器中预装了很多CA的证书。
- 浏览器从内置的证书列表中索引,找到数字证书中的证书颁发者的公钥,如果找不到证明验证失败,服务器的证书不是由权威机构颁发的,是不可信任的。如果找到了就用这个公钥对数字签名进行解密。
- 正常情况下,解密之后的内容其实就是证书内容然后用证书签名算法,即hash函数签名后的一段摘要,而我们只需要用同样的hash函数对明文内容进行签名,得到的摘要和解密后的内容是一致的,就证明这个证书是由CA颁发的。
- 然后浏览器再比对站点的网址和证书中的网址是否一致;一致的话再比对证书是否过期;
- 全都验证通过才认为这个网址是合法的,可以安全使用这个网站的公钥了。
浏览器生成一个随机数pre-master,并用服务器公钥对pre-master进行加密,因此只有服务器的私钥才可以解密。浏览器传输加密后的pre-master
服务器用私钥解密pre-master,然后用这三个随机数生成会话秘钥master secret,这个会话秘钥就是堆成加密的秘钥,使用对称加密算法对网页内容进行加密。这个加密算法是第一步就商量好的
服务器返回加密后的网页
浏览器使用同样的对称加密算法使用R对网页内容解密,渲染网页。
补充
证书加密和解密过程
对称加密AES
其实更细节的东西并未在这篇博客里详尽描述,比如SSL 和TSL的差别,以及密码套件的具体表示方式,还有证书链等等,有待自行探索。