如何用网络安全的知识来解释HTTPS的加密过程将是这一篇文章重点讲解的内容,首先通过网络安全基础我们知道加密分为对称加密和非对称加密,对称加密速度快,通常用在加密数据,难度在于管理密钥以及密钥的传输,因为双方都需要一个对称密钥,而非对称密钥,私钥由自己存放,没有传递的过程,但复杂度也是非常耗时,因此非对称通常用来加密对称密钥,但是非对称加密的公钥也需要进行传输,如何保证公钥的身份认证,这里就需要第三方的权威CA作认证,你相信CA, CA对这个公钥进行签名,那么你就相信这个公钥了,也就解决了公钥的身份认证,两种加密方式通常都是结合在一起用
一般的数据加密过程
对数据进行(hash)形成摘要 用于验证数据的完整性对摘要用自己的私钥进行加密 用于身份认证对原数据和摘要用对称密钥进行加密 用于数据的私密性用对方的公钥加密对称密钥 用于密钥交换如何保证公钥的身份认证 CA认证
HTTPS的加密过程
client 实际上是浏览器,访问网页 https://10.8.117.147server 会回一个证书包括了server的公钥和经过CA签名的明文信息的摘要client 收到证书后需要验证证书是可以被信任的,从而再提取里面的公钥 如何验证该证书可以被信任的前题是我们相信一个CA,由该CA颁发的证书我们就相信, 我们需要到CA那获取CA的公钥去解开CA签名, 证明该证书的确是由CA颁发的,因为是由CA私钥加密的 其次通过计算hash明文信息对比解开的摘要,以验证数据的完整性 浏览器是如何获得CA的公钥: 浏览器预先安装了CA的根证书,并予以信任,当接收到server来的证书时,可以用根证书的公钥去解开由CA私钥签名 最后验证证书的域名信息/有效时间/是否吊销后验证通过提取server的公钥 client端生成pre-master key并用server的公钥进行加密传给server,这就是用来为以后加密数据的对称密钥server 用自己的私钥解开对称密钥,以后通信就用对称密钥加密通信finished
client: 10.103.51.142--> server: 10.8.117.147 抓包结果
简化如图
client hello
客户端发起请求,以明文信息传输,包含版本信息,加密套件,压缩算法,随机数 random_C, 用于后续对称密钥生成
server hello
服务端返回信息包括选择的协议版本TLS1.2, 选择的加密套件TLS_RSA_WITH_AES_256_CBC_SHA,套件包括AU身份认证,KeyExchange密钥交换算法,对称加密算法Enc,信息摘要完整性Mac压缩算法为空随机数 random_S
certificate
证书的详细信息
可见证书包括了有效期,域名,公钥信息,以及该证书被CA私钥加密的证书签名,将此证书传给client,client收到证书后需要验证证书的有效性,具体过程就是向CA获取公钥,如果能解开证书签名,则说明该证书是由该CA颁发的,信得过,随后再hash明文信息得到摘要与解密的签名得到的摘要来验证数据完整性,最后验证域名及时间,难验证通过
client_key_exchange+change_cipher_spec_encrypted_handshake_message
client_key_exchange, 证书验证通过后提取证书中的公钥信息(server的公钥),客户端计算产生随机数字pre_master,并用公钥加密,发送给服务器客户端得到客户端一开始产生的随机数random_C, 服务端产生的随机数 random_S,以及计算产生随机数字pre_masterenc_key = Func(random_C, random_S, pre_master)产生对称密钥,用三个参数是为了防止随机并不随机change_cipher_spec: 客户端通知服务器后续的通信采用协商的密钥进行加密通信encrypted_handshake_message: 计算一段值发送给服务器用于握手验证
new_session_ticket, change_cipher_spec, encrypted_handshake_message
服务器用自己的私钥解密用服务器公钥加密的pre_master数据,基于之前交换的random_C, random_SEnc = Func (random_C, random_S, pre_master)同样可以得到对称密钥,关键的就是pre_master是客户端用服务器的公钥加密而来计算之前所有信息的hash值,然后解密客户端发来的encrypted_handshake_message验证数据的完整性change_cipher_spec, 之前握手都是明文传输,服务器同样告知客户端以后都用协商的密钥加密进行传输encrypted_handshake_message: 服务器也根据当前的一些通信参数及数据并采用协商密钥与算法加密发送给客户端
客户端收到信息后,计算接收信息的hash值与服务器发过来的encrypted_handshake_message,验证数据,并握手完成,之后的通信则用对称密钥加密
前面是根据抓包来简要分析过程,简而方之可以看下图
1 客户端发起https请求
2 服务器产生私钥和证书请求,向权威认证机构CA去申请证书,其中包括自己的公钥以及CA的签名
3 传送证书给客户端,包含公钥,证书签名(CA的私钥加密)
4 客户端验证证书的有效性,客户端检查自己服务器装的根证书,如果server发过来的证书是由这些机构颁发的,再检查域名,有效期,才认为有效,验证通过后,客户端生成pre_master随机值,并用证书里的公钥加密传给服务器
5 传送用公钥加密的随机值
6 服务器用私钥解出pre_master随机值,通过计算得到对称密钥,对数据内容用对称密钥加密
7 传输用对称加密后的信息
8 客户端接到用对称密钥加密的信息,同样用对称密钥进行解密,获取内容
参考:
http://www.jb51.net/network/68135.htmlhttp://blog.csdn.net/skykingf/article/details/50436821