这里补充一下,并不是说非对称加密算法的效率低,而是非对称加密算法在通讯的时候具有“局限性”,这个局限性使得它不能用于双向通讯,但比较适合单方向通讯。因为公钥是人尽皆知的,包括试图在中间拦截信息的人,它也知道公钥。但是秘钥(证书的秘钥)是只有网站 server 才知道的。使用公钥加密的信息,必须用私钥来解密。这就导致了,使用这个公钥加密的信息,只有网站 server 才能解密和读取,这么一个机制。其他任何人就算可以看到加密后的内容,也都无法解密和读取。而你访问网站的时候,和网站是要双向通讯的。如果服务器用公钥加密了内容返回给你,是没用的,你没有它的私密钥匙就解密不了。因此,建立起双向通讯之前是协商对称算法主秘钥的过程,客户端(也就是你的浏览器)自己指定一个对称算法,以及对称算法的随机指定的主密钥,用网站提供的共钥加密后,发给网站,网站用自己的私密钥解密后,开始用客户端提议的这个对称加密算法和它的主密钥对自己回复的内容进行加密来通讯,于是,这个双向通讯的连接就算建立起来了。这个协商过程中最关键和最敏感的信息就是主密钥,其他信息(比如说你支持那些加密算法啦,我们用什么算法加密啦)被其他人获取都是无所谓的。而这个主密钥在协商过程中,在中间看到了通讯数据的任何其他人无法解密而无法获知。之后中间人看到的就是用对称加密算法和该主密钥加密后的数据,中间人无法解密。所以 tls 协议概括一下就是,客户端和服务端使用非对称加密算法协商出对称加密算法的主密钥(使用非对称加密算法保护主密钥不被中间人窃取),然后切换到使用对称加密算法(使用对应的主密钥)进行双向通讯。