昨天我介绍了 HTTP/2 协议 ,它只有在 HTTPS 环境才会生效。
为了升级到 HTTP/2 协议,必须先启用 HTTPS。如果你不了解 HTTPS 协议(学名 TLS 协议),可以参考以下文章。
本文介绍如何将一个 HTTP 网站升级到 HTTPS 。
获取证书
升级到 HTTPS 协议的第一步,就是要获得一张证书。
证书是一个二进制文件,里面包含经过认证的网站公钥和一些元数据,要从经销商购买。
证书有很多类型,首先分为三种
认证级别。
- 域名认证(Domain Validation):最低级别认证,可以确认申请人拥有这个域名。对于这种证书,浏览器会在地址栏显示一把锁。
- 公司认证(Company Validation):确认域名所有人是哪一家公司,证书里面会包含公司信息。
- 扩展认证(Extended Validation):最高级别的认证,浏览器地址栏会显示公司名。
还分为三种覆盖范围。
- 单域名证书:只能用于单一域名,foo.com的证书不能用于www.foo.com
- 通配符证书:可以用于某个域名及其所有一级子域名,比如*.foo.com的证书可以用于foo.com,也可以用于www.foo.com
- 多域名证书:可以用于多个域名,比如foo.com和bar.com
认证级别越高、覆盖范围越广的证书,价格越贵。
还有一个免费证书的选择。为了推广HTTPS协议,电子前哨基金会EFF成立了 Let’s Encrypt,提供免费证书(教程和工具)。
- 可以参考本网站中的: Let’s Encrypt 简单使用
拿到证书以后,可以用 SSL Checker 检查一下,信息是否正确。
安装证书
证书可以放在/etc/ssl
目录(Linux 系统),然后根据你使用的Web服务器进行配置。
如果使用 Let’s Encrypt 证书,请使用自动安装工具 Certbot。
安装成功后,使用 SSL Server Test 检查一下证书是否生效。
修改链接
下一步,网页加载的 HTTP 资源,要全部改成 HTTPS 链接。因为加密网页内如果有非加密的资源,浏览器是不会加载那些资源的。
这也是为什么SSL配置成功后,小绿锁不显示的原因之一
1 | <script src="http://foo.com/jquery.js"></script> |
上面这行加载命令,有两种改法。
1 | <!-- 改法一 --> |
其中,改法二会根据当前网页的协议,加载相同协议的外部资源,更灵活一些。
另外,如果页面头部用到了rel="canonical"
,也要改成HTTPS网址。
1 | <link rel="canonical" href="https://foo.com/bar.html" /> |
301重定向
下一步,修改 Web 服务器的配置文件,使用 301 重定向,将 HTTP 协议的访问导向 HTTPS 协议。
1 | server { |
1 | RewriteEngine On |
安全措施
以下措施可以进一步保证通信安全。
HTTP Strict Transport Security (HSTS)
访问网站时,用户很少直接在地址栏输入https://
,总是通过点击链接,或者3xx
重定向,从HTTP
页面进入HTTPS
页面。攻击者完全可以在用户发出HTTP
请求时,劫持并篡改该请求。
另一种情况是恶意网站使用自签名证书,冒充另一个网站,这时浏览器会给出警告,但是许多用户会忽略警告继续访问。
“HTTP严格传输安全”(简称 HSTS)的作用,就是强制浏览器只能发出HTTPS
请求,并阻止用户接受不安全的证书。
它在网站的响应头里面,加入一个强制性声明。以下例子摘自 维基百科。
1 | Strict-Transport-Security: max-age=31536000; includeSubDomains |
上面这段头信息有两个作用。
1 | (1)在接下来的一年(即31536000秒)中,浏览器只要向example.com或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。用户点击超链接或在地址栏输入`http://www.example.com/`,浏览器应当自动将http转写成https,然后直接向`https://www.example.com/`发送请求。 |
HSTS
很大程度上解决了 SSL
剥离攻击。只要浏览器曾经与服务器建立过一次安全连接,之后浏览器会强制使用HTTPS
,即使链接被换成了HTTP
。
该方法的主要不足是,用户首次访问网站发出HTTP请求时,是不受HSTS保护的。
如果想要全面分析网站的安全程度,可以使用 Mozilla 的 Observatory。
Cookie
另一个需要注意的地方是,确保浏览器只在使用 HTTPS 时,才发送Cookie。
网站响应头里面,Set-Cookie
字段加上 Secure
标志即可。
1 | Set-Cookie: LSID=DQAAAK...Eaem_vYg; Secure |
参考
HTTPS 升级指南, By 阮一峰
How To Migrate To HTTPS, by Chris Palmer