HTTPS 是建立在HTTP+SSL 基础之上的。 SSL 在传输层对需要传输的数据进行了加密。
握手过程:
- 类似于TCP 握手,在第一次建立链接时,客户端先 发送一段 消息给到服务端 包含客户端支持的加密算法,还有一个随机数A用于后续的计算。
-
服务端收到消息后,回复一段消息。消息包含:客户端支持的一个加密算法(上面给出了列表), session ID,另外一个随机数B,数字证书(包含公钥)。
- 客户端收到信息后,验证证书有效性(有效期啊,域名啊等等)。
- 客户端再生成一个随机数C 同时从数字证书中提取出公钥,加密这个随机数 并发送给服务端。
- 此时服务端要求客户端发送一个用客户端的私玥加密后的随机数D,加上客户端证书(包含公钥),这个也可以不发送(发送no digital certificate alert)这只是一个警告,如果是双向认证(强制认证),则会握手失败,否则继续。
- 服务端验证客户端的证书。此时 客户端和服务端都具有了 ABC D (如果有)三个随机数。 两边用第1步的商定的加密算法加密这三个随机数生成一个 secret key 作为对称加密密钥。
7.客户端发送“”finished” 消息给到服务端(这个消息用 对称加密的密钥secret key加密)。完成了握手,服务端同样发送加密后的“finished”消息给客户端。 - 之后客户端和服务端的消息都用这个密钥加密消息内容。
我想起一个问题,如果dns被篡改后指向一个钓鱼网站,但是钓鱼网站能够生成一个目标一致的认证证书(比如用免费https就只需要提供域名就能颁发一个证书),那岂不是会欺骗到客户端?客户端验证如何判断证书真伪?