“客户端通过服务端的公钥对私钥加密”这句话就错了,私钥全程不参与传输,自然也不会被加密。客户端加密并发送的是用来握手的随机数。
服务器如何确认客户端是真实的客户端?答案是:双向认证。不仅客户端要验证服务器的证书,服务器同样要验证客户端的证书,彻底杜绝中间人攻击的可能。需要双向认证的场景在B/S架构中很罕见,多见于C/S架构,因为服务器需要预置客户端的证书。有不少APP都使用了这一技术防止被抓包。
而在传统的SSL单向认证中,黑客可能在其中充当中间人的角色,他可以欺骗服务器自己是客户端,但无法欺骗客户端自己是服务器,因为他没有服务器的私钥,不能解密客户端用公钥加密的随机数,也就无法和客户端完成握手。黑客可以伪造一份自签名证书给客户端,但由于黑客不是可信CA,客户端的浏览器将提示证书无效。