每次在浏览器地址栏看到那把绿色的小锁,你是不是心里就有一种"安全"的感觉?但这把锁到底意味着什么?它真的能保护你吗?
HTTP的裸奔时代
早期的互联网数据传输用的是HTTP协议,所有的数据都是明文传输。这意味着如果你在咖啡厅连WiFi,别人可以轻松看到你访问了哪些网页、填了什么表单、甚至你的登录密码。这就是所谓的"中间人攻击"(Man-in-the-Middle)。
解决这个问题的方法就是HTTPS——在HTTP外面套一层加密层,这层加密层就是TLS(Transport Layer Security)。
SSL到TLS的进化
SSL(Secure Sockets Layer)最初由网景公司(Netscape)在1990年代开发。SSL 1.0从未公开发布,2.0和3.0也因为各种漏洞被废弃。TLS 1.0在1999年取代SSL 3.0,之后又经历了1.1、1.2、1.3版本。
目前TLS 1.2和1.3是主流,TLS 1.0和1.1已被主流浏览器废弃。
TLS握手:密钥是如何商定的
HTTPS的建立过程叫做"TLS握手"。整个过程大概如下:
第一步,客户端(你的浏览器)向服务器打招呼,说"你好,我支持这些加密套件和TLS版本"。
第二步,服务器回复,包含它的SSL证书(包含公钥和一些身份信息)以及它选择的加密参数。
第三步,客户端验证证书是否有效:是否由可信的CA签发、是否在有效期内、域名是否匹配。
第四步,双方用证书中的公钥或Diffie-Hellman密钥交换,协商出会话密钥。
第五步,双方切换到加密模式,开始传输真正的数据。
证书与证书颁发机构
SSL证书本质上是一个数字文件,声明"这个域名属于某某公司,由某某CA签发"。证书里包含了网站的公钥、网站的身份信息、有效期、签名等。
CA(Certificate Authority,证书颁发机构)是第三方信任实体。浏览器内置了信任的根CA列表——像DigiCert、GlobalSign、Let's Encrypt这些公司。如果一个证书是由你信任的CA签发的,浏览器就认为它是可信的。
这就是为什么"自签名证书"(自己给自己签的)会被浏览器标记为不安全——因为你信任的CA没有为它背书。
HTTPS真正保护了什么
HTTPS能保护的是传输中的数据:
- 内容加密:第三方无法读取传输的网页内容、表单数据、登录凭证
- 完整性验证:数据被篡改会被发现(HMAC机制)
- 身份认证:确认你访问的确实是真实的网站(而非钓鱼网站)
但HTTPS不是万能的:它不保护你的设备被入侵、不保护服务器本身的漏洞、不加密DNS查询(除非使用DNS over HTTPS)、也不加密访问了哪些域名(虽然加密了具体页面)。
证书透明(Certificate Transparency)
2013年,Google引入了证书透明(CT)机制来解决CA可能滥发证书的问题。所有公开可信的SSL证书都必须记录在CT日志中,任何人都可以查询。这意味着即使CA被攻击或被恶意签发证书,也有办法被发现。
混合内容问题
一个HTTPS页面如果加载了HTTP的资源(图片、脚本、样式表),就叫"混合内容"。这时候页面的安全性会降级,因为攻击者可以通过未加密的资源注入恶意代码。即使主域名是HTTPS,如果加载了HTTP内容,攻击者仍然有机可乘。
如何判断一个网站是否真的安全
看到锁图标不要盲目信任,以下几点值得关注:
- 证书是否由可信CA签发
- 证书的域名是否与你访问的域名完全匹配
- 证书是否在有效期内
- 是否使用TLS 1.2或更高版本
- 是否使用了强加密套件(注意一些老旧的RC4、3DES套件已被禁用)
- 是否启用了HSTS(强制HTTPS)
Let's Encrypt与HTTPS普及
2016年Let's Encrypt上线后,HTTPS的普及速度大幅提升。他们提供免费的SSL证书,自动化部署,大大降低了网站启用HTTPS的门槛。如今全球大多数主流网站都已切换到HTTPS。
总结
HTTPS不是什么高深莫测的技术,但它确实让互联网变得安全了很多。下次在浏览器看到那把锁,可以会心一笑——这背后是一整套精心设计的密码学机制在保护着你。