https是http over TLS(transport security layer)的缩写。也即说明http协议是不安全的,是TLS协议保证的安全。协议层级图如下:
我们常说https协议是安全的,主要是指两点:
- 第一,通信两端可以进行身份验证。
- 第二,数据传输过程安全。
既然提到身份验证和传输安全就不得不提加密算法和数字证书机制。
加密算法主要分为对称加密算法与非对称加密算法。所谓对称加密算法,加密、解密使用相同的密钥,常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。相应的非对称加密算法用于加密、解密的密钥是一对儿,如果用其中一个来加密,只能用另外一个来解密,反之亦然,常用的算法有:RSA、DSA、ECC、DH等。
TLS还涉及到到了摘要算法MAC(message authentication code),用以确保传输过程中的数据没有被修改替换。摘要算法也需要一个密钥,不过这个密钥不是用来做加解密的,而是用来做生成摘要时的盐。摘要算法是一个单向函数,不能通过摘要反解出原内容。常用的算法有:CRC、MD5、SHA等。
数字证书是一个认证体系。我们经常接触的银行U盾,企业登陆社保公积金网站时用到的电子证书等, 都是数字证书。数字证书由CA(certificate authority)机构颁发,有有效期, 到期需要更换,且是付费的。证书的生成就是依赖上文所述的非对称加密算法。颁发一个证书就是生成一对密钥,然后用CA机构的数字证书(私钥)进行签名认证,以此来保证数字证书的合法性。私钥保留在申请者手里,要保证私钥绝对安全,不能被别人获取,所以我们会采用很多的方式来保护私钥。公钥则是对外公布使用的。
数字证书还有根证书、证书链两个概念。终端证书是由CA机构的证书进行签发的,那么CA机构的证书又是谁签发的?怎么验证CA机构证书的合法性?结构如下:
final certificate <--> CA certificate <--> CA certificate <--> CA.... <-->root certificate
终端证书由CA证书签发,这个CA证书由另外一个CA证书签发,循环往上,直至根证书。那么根证书由谁签发的呢?根证书是一个自签名证书。那么根证书怎么认证呢?这就靠相关实现自己维护了(比如以约定的方式:我说它是合法的根证书,它就是合法的根证书)。以chrome浏览器为例,chrome浏览器维护有一个根证书库:https://chromium.googlesource.com/chromium/src/+/main/net/data/ssl/chrome_root_store/root_store.md
然后chrome浏览器会将根证书缓存在本地
数字证书验证过程如下(以浏览器为例),注意不是身份验证哈:
- 浏览器访问某个服务器,要求服务器下发自己的数字证书(终端证书),实际上是下发证书链,但不包含根证书。
- 浏览器从服务器证书开始,依次用后一个CA证书对前一个证书进行验证,直至最后一个CA证书,这时浏览器就从本地根证书池去查找这个CA证书的签发证书,进行验证。如果通过,则表明服务器证书合法。
数字签发过程是用私钥加密,验证过程是用公钥解密,如果能解析,则表明证书合法
https://datatracker.ietf.org/doc/html/rfc2817
https://datatracker.ietf.org/doc/html/rfc2818
https://datatracker.ietf.org/doc/html/rfc3749https://datatracker.ietf.org/doc/html/rfc5246#section-7.4.8
https://www.cloudflare.com/zh-cn/learning/ssl/what-happens-in-a-tls-handshake/
https://blog.csdn.net/Dancen/article/details/120979520