HTTPS的交互流程、数字证书、数字签名
网上看了很多HTTPS的文章,在一些细节方面并没有统一,这一块做java的不管是客户端还是服务端都需要有一定的了解
1.涉及到密码学,对称加密和非对称加密都需要使用,对称加密没啥要说的,最终明文会通过对称加密来发送。
非对称加密有个坑,网上很多人说什么给数据加密的叫私钥,解密的叫公钥,也有反过来说,加密的是公钥,解密的是私钥。
从密码学角度来说,公钥私钥都可以用于加密和解密,只是看具体应用场景而已。私钥加密需要公钥解密,公钥加密需要私钥解密。
2.所有外层都是为了防篡改,最内层才包含防泄露,从这个目的出发,网上很多人视图用各种例子阐述黑客的篡改过程,说真的很生动有趣。
简要文字交互过程如下:
客户端->服务端,发起请求,随机数等
----服务端向客户端发送证书
客户端<-服务端,数字证书(CA颁发,包含CA私钥加密过的服务端公钥,服务端加密算法,DNS域名,数字签名等)
#客户端拿到服务端数字证书
通过内置CA公钥进行数字证书验证(包含CA公钥解密、验证数字签名、验证域名、验证有效期等,若出现不可置信等证书时可对用户作出警告是否继续连接),若验证通过
----约定算法
客户端->服务端,发送可用算法(双向认证时,客户端还将发送客户端数字证书,包含客户端公钥等)
(双向认证时服务端同样校验客户端证书有效性,若校验通过)
客户端<-服务端,加密算法(双向认证时,此算法使用客户端公钥加密)
#客户端拿到加密算法(双向认证时,使用客户端私钥解密获得加密算法)
----生成对称密钥,并完成传输
客户端通过第一步随机数生成随机对称密钥,使用服务端公钥加密对称密钥
客户端->服务端,将加密后的对称密钥给到服务端
客户端<-服务端,服务端先用服务端私钥解开得到对称密钥,用对称密钥加密需要发送对内容后,发给客户端
3.数字证书是CA颁发,代表权威,其以链(树)式存在。
客户端浏览器或操作系统如果被黑,可能导致本地对CA公钥被篡改,这时无解。
数字签名实质是对数字证书内容(服务端公钥、服务端加密算法、域名等)的MD5,防止数字证书被私下篡改

浙公网安备 33010602011771号