http 缺点
- 通信使用明文(不加密),内容可能会被窃听。
- 不验证通信方的身份,因此有可能遭遇伪装。
- 无法证明报文的完整性,所以有可能已遭篡改。
于是有了通信加密协议 SSL/TLS保证通信的安全。关于SSL/TLS
https
一、优势
- HTTPS = HTTP + SSL/TLS
HTTPS = HTTP + 加密 + 认证 + 完整性保护 - 此外,https 也是使用 http2 的必要条件。 关于http2
- 提升搜索排名。
二、 劣势
- 购买证书是不小的开销。
- 加密通信会消耗更多的CPU和内存资源。
https or not
淘宝、京东等电商已经采用https协议,腾讯、美团、新浪、网易等服务提供商仍然采用 http 协议.(时间 2016/12/12)
所以,如果你的网站属于电子商务、金融、社交网络等领域的话,那最好是采用 HTTPS 协议;如果是博客站点、宣传类网站、分类信息网站、或者是新闻网站之类的话,酌情考虑是否需要升级,非 HTTPS 网站很容易被劫持并插入广告,影响用户体验。
https升级步骤
一、购买证书
证书分三种认证级别
- 域名认证(Domain Validation):最低级别认证,可以确认申请人拥有这个域名。对于这种证书,浏览器会在地址栏显示一把锁。
- 公司认证(Company Validation):确认域名所有人是哪一家公司,证书里面会包含公司信息。
- 扩展认证(Extended Validation):最高级别的认证,浏览器地址栏会显示公司名。
还分为三种覆盖范围
- 单域名证书:只能用于单一域名,foo.com 的证书不能用于 www.foo.com
- 通配符证书:可以用于某个域名及其所有一级子域名,比如 *.foo.com 的证书可以用于 foo.com,也可以用于 www.foo.com
- 多域名证书:可以用于多个域名,比如 foo.com 和 bar.com
调研大公司的证书选择
注意:通配符证书一般也只能支持到二级域名
二、 浏览器直接访问 http 资源
在网站全站 HTTPS 后,如果用户手动敲入网站的 HTTP 地址,或者从其它地方点击了网站的 HTTP 链接,依赖于服务端 301/302 跳转才能使用 HTTPS 服务。
如:nginx
攻击者完全可以在用户发出HTTP请求时,劫持并篡改该请求。
另一种情况是恶意网站使用自签名证书,冒充另一个网站,这时浏览器会给出警告,但是许多用户会忽略警告继续访问。
HSTS 基本使用
HTTP严格传输安全”(简称 HSTS)的作用,就是强制浏览器只能发出HTTPS请求,并阻止用户接受不安全的证书。HSTS 是一个响应头,格式如下:
|
|
上面这段头信息有两个作用。
- 在接下来的一年(即31536000秒)中,浏览器只要向example.com或其子域名发送HTTP请求时,必须采用HTTPS来发起连接。用户点击超链接或在地址栏输入http://www.example.com/,浏览器应当自动将http转写成https,然后直接向https://www.example.com/发送请求。
- 在接下来的一年中,如果example.com服务器发送的证书无效,用户不能忽略浏览器警告,将无法继续访问该网站。
HSTS 这个响应头只能用于 HTTPS 响应;网站必须使用默认的 443 端口;必须使用域名,不能是 IP。而且启用 HSTS 之后,一旦网站证书错误,用户无法选择忽略。
HSTS 很大程度上解决了 SSL 剥离攻击。只要浏览器曾经与服务器建立过一次安全连接,之后浏览器会强制使用HTTPS,即使链接被换成了HTTP。
该方法的主要不足是,用户首次访问网站发出HTTP请求时,是不受HSTS保护的。为了解决这个问题,各浏览器提供商提出HSTS Preload List方案.参见申请加入谷歌HSTS预加载列表
三、资源替换
https 页面中加载 http 资源称为混合内容(Mixed Content).各浏览器对混合内容的加载将表现不同的行为,为了最好的用户体验,Https 网站中不要出现混合内容,即Https页面中的所有资源都必须是 https 的。
当前很多支持 HTTPS 的网站出于各种原因,针对老旧浏览器或特殊网络还是允许通过 HTTP 访问。这时候,强烈建议让所有资源服务都同时支持 HTTP/HTTPS 访问。这样只要页面在使用这些资源时省略协议部分,浏览器就能根据主页面协议类型来自动选择 HTTP/HTTPS 资源。
|
|
针对现代浏览器,还可以通过 upgrade-insecure-requests 这个 CSP 指令,让浏览器自动替换。google提供的demo
目前支持的浏览器较少 参考
HTTP 响应头方式:
<meta>
标签方式:
四、服务代理
在启用 HTTPS 的实际过程中,本站的静态资源和接口相对容易改造,毕竟都可控。但很多第三方资源或接口就是不提供 HTTPS,那就只能在服务端做一层 HTTPS 代理。
需要注意:
- 代理对请求 Referrer、被代理的 URL 都需要做好白名单机制;
- 代理会造成第三方通过 REMOTE_ADDR 拿到的是代理 IP,很可能导致这个 IP 被限制请求频率或被封;
代理只能拿到自己域名下的 Cookie,需要从其它域获取 Cookie 的第三方接口被代理后可能不能正常工作;
另外,对于页面上通过 iframe 嵌入的第三方 HTTP 页面,如果要做 HTTPS 代理,还需要修改页面里的所有资源链接,很容易出问题。对于这种情况,强烈建议联系第三方修改或者换产品方案,不要在 HTTPS 代理上耗费太多精力。
五、 注意
证书选择
如果要照顾没有打 XP SP3 补丁的 IE6 用户,只能继续使用 SHA-1 算法实现的SSL证书(SHA-1算法的安全性逐年降低)。
SSL选择
IE 6 默认只支持 SSLv2 和 SSLv3,也就是说 HTTPS 网站要支持 IE 6,就必须启用 SSLv3. Nginx 从 1.9.1 开始默认只支持 TLS 的三个版本。