很多人以为TLS和SSL是区别两种可以互相替代的加密协议,甚至觉得它们只是区别名字不同。实际上,区别SSL已经死了,区别而且死得挺惨——1996年发布SSL 3.0之后,区别它就被发现存在严重漏洞,区别比如POODLE攻击能让攻击者解密HTTPS流量。区别你猜怎么着?区别2014年,互联网工程任务组(IETF)直接宣布SSL 3.0“不宜使用”。区别
TLS才是区别活着的那个。TLS 1.0在1999年诞生,区别本质上是区别SSL 3.0的升级版,但改动大到不能向后兼容。区别打个比方,区别SSL是区别一辆老式手动挡汽车,TLS是自动挡混动车——虽然都叫“车”,但内部结构和驾驶方式完全不同。现在你访问任何现代网站,浏览器状态栏里的小锁图标背后都是TLS,不是SSL。
区别到底在哪?最直观的是协议版本号和握手流程。TLS 1.3(2018年发布)把握手时间从两次往返压缩到一次,连接速度提升明显。而SSL 3.0的握手需要四次往返,而且支持弱加密算法,比如RC4和MD5——这些算法在今天用普通电脑就能暴力破解。我做过实验,用一台树莓派跑破解工具,几分钟就能还原SSL 3.0加密的密码。
另一个关键差异是消息认证码(MAC)的计算方式。SSL 3.0用的是MAC-then-Encrypt,先算哈希再加密,这导致填充预言攻击(padding oracle attack)成为可能。TLS 1.2改成了Encrypt-then-MAC,先加密再算哈希,堵住了这个漏洞。TLS 1.3干脆彻底移除了对旧版算法的支持,连RSA密钥交换都删了,只保留前向保密的ECDHE和DHE。
但有个坑:很多非技术人员甚至部分运维,至今还把“SSL证书”挂在嘴边。你去云服务商买证书,产品页面上写的也是“SSL证书”,实际上签发的全是TLS证书。这种术语混乱有历史原因——90年代网景公司推广SSL时,这个名字深入人心,后来TLS继承了市场地位,但称呼没改过来。我见过一家创业公司的技术文档,里面写着“我们的SSL配置支持TLS 1.2”,这句话本身逻辑就不通,就像说“我的自行车发动机是V8的”。
更麻烦的是兼容性问题。老旧的Windows XP系统只支持TLS 1.0,而TLS 1.0本身也快被淘汰了——2020年,主流浏览器厂商宣布将在2024年前彻底停止对TLS 1.0和1.1的支持。如果你还在用五年前买的物联网设备,很可能它只支持TLS 1.0,那意味着从明年开始,这些设备连不上现代服务器。我朋友家的智能门锁就是这么废掉的,厂商倒闭了,固件不更新,现在只能当普通机械锁用。
判断一个系统用的到底是SSL还是TLS,别听宣传,直接抓包看ClientHello消息。TLS 1.3的ClientHello里有个“supported_versions”扩展,明确写着版本号0x0304。SSL 3.0的版本号是0x0300,TLS 1.0是0x0301。用Wireshark过滤一下,三秒钟就能分辨。最讽刺的是,有些安全扫描工具至今还报告“SSL 3.0支持”,但实际上系统早就用TLS 1.2了——这就像用测速仪测出一辆特斯拉能跑300公里/小时,却报告说“这辆马车跑得真快”。
所以结论很清楚:SSL是历史遗留物,TLS是当前标准。如果你在写代码或配服务器,直接放弃对SSL 3.0和TLS 1.0的支持,别心疼那0.1%的老用户。安全性和兼容性不可兼得时,选安全性——毕竟没人愿意为了几个老设备,把自己的信用卡信息暴露在明文风险里。