关于启用 HTTPS 的一些经验分享

2015/12/04 · 基础技术 ·
HTTP,
HTTPS

原文出处:
imququ(@屈光宇)   

随着国内网络环境的持续恶化,各种篡改和劫持层出不穷,越来越多的网站选择了全站
HTTPS。就在今天,免费提供证书服务的 Let’s
Encrypt
 项目也正式开放,HTTPS 很快就会成为
WEB 必选项。HTTPS 通过 TLS
层和证书机制提供了内容加密、身份认证和数据完整性三大功能,可以有效防止数据被查看或篡改,以及防止中间人冒充。本文分享一些启用
HTTPS 过程中的经验,重点是如何与一些新出的安全规范配合使用。至于 HTTPS
的部署及优化,之前写过很多,本文不重复了。

跑步进入全站 HTTPS ,这些经验值得你看看

随着国内网络环境的持续恶化,各种篡改和劫持层出不穷,越来越多的网站选择了全站
HTTPS。就在前几天,免费提供证书服务的 Let’s
Encrypt 项目也正式开放测试,HTTPS 很快就会成为 WEB 必选项。HTTPS 通过
TLS
层和证书机制提供了内容加密、身份认证和数据完整性三大功能,可以有效防止数据被查看或篡改,以及防止中间人冒充。本文分享一些启用
HTTPS 过程中的经验,重点是如何与一些新出的安全规范配合使用。至于 HTTPS
的部署及优化,之前写过很多,本文不重复了。

图片 1

理解 Mixed Content

HTTPS 网页中加载的 HTTP 资源被称之为 Mixed
Content(混合内容),不同浏览器对 Mixed Content 有不一样的处理规则。

理解 Mixed Content

HTTPS 网页中加载的 HTTP 资源被称之为混合内容(Mixed
Content),不同浏览器对混合内容有不一样的处理规则。

早期的 IE

早期的 IE 在发现 Mixed Content
请求时,会弹出「是否只查看安全传送的网页内容?」这样一个模态对话框,一旦用户选择「是」,所有
Mixed Content 资源都不会加载;选择「否」,所有资源都加载。

早期的 IE

早期的 IE 在发现
混合内容请求时,会弹出「是否只查看安全传送的网页内容?」这样一个模态对话框,一旦用户选择「是」,所有混合内容资源都不会加载;选择「否」,所有资源都加载。

比较新的 IE

比较新的 IE
将模态对话框改为页面底部的提示条,没有之前那么干扰用户。而且默认会加载图片类
Mixed Content,其它如 JavaScript、CSS
等资源还是会根据用户选择来决定是否加载。

比较新的 IE

比较新的 IE
将模态对话框改为页面底部的提示条,没有之前那么干扰用户。而且默认会加载图片类混合内容,其它如
JavaScript、CSS 等资源还是会根据用户选择来决定是否加载。

现代浏览器

现代浏览器(Chrome、Firefox、Safari、Microsoft Edge),基本上都遵守了
W3C 的 Mixed Content 规范,将
Mixed Content 分为Optionally-blockable 和 Blockable 两类:

Optionally-blockable 类 Mixed Content
包含那些危险较小,即使被中间人篡改也无大碍的资源。现代浏览器默认会加载这类资源,同时会在控制台打印警告信息。这类资源包括:

  • 通过 <img> 标签加载的图片(包括 SVG 图片);
  • 通过 <video> / <audio> 和 <source> 标签加载的视频或音频;
  • 预读的(Prefetched)资源;

除此之外所有的 Mixed Content
都是 Blockable,浏览器必须禁止加载这类资源。所以现代浏览器中,对于
HTTPS 页面中的 JavaScript、CSS 等 HTTP
资源,一律不加载,直接在控制台打印错误信息。

现代浏览器

现代浏览器(Chrome、Firefox、Safari、Microsoft Edge),基本上都遵守了
W3C 的混合内容Mixed Content规范,将
混合内容分为 Optionally-blockable 和 Blockable 两类:

Optionally-blockable 类混合内容包含那些危险较小,即使被中间人篡改也无大碍的资源。现代浏览器默认会加载这类资源,同时会在控制台打印警告信息。这类资源包括:

  • 通过 <img> 标签加载的图片(包括 SVG 图片);
  • 通过 <video> / <audio> 和 <source> 标签加载的视频或音频;
  • 预读的(Prefetched)资源;

除此之外所有的混合内容都是 Blockable,浏览器必须禁止加载这类资源。所以现代浏览器中,对于
HTTPS 页面中的 JavaScript、CSS 等 HTTP
资源,一律不加载,直接在控制台打印错误信息。

移动浏览器

前面所说都是桌面浏览器的行为,移动端情况比较复杂,当前大部分移动浏览器默认都允许加载
Mixed Content。也就是说,对于移动浏览器来说,HTTPS 中的 HTTP
资源,无论是图片还是 JavaScript、CSS,默认都会加载。

一般选择了全站 HTTPS,就要避免出现 Mixed Content,页面所有资源请求都走
HTTPS 协议才能保证所有平台所有浏览器下都没有问题。

移动浏览器

前面所说都是桌面浏览器的行为,移动端情况比较复杂,当前大部分移动浏览器默认允许加载所有混合内容。也就是说,对于移动浏览器来说,HTTPS
中的 HTTP 资源,无论是图片还是 JavaScript、CSS,默认都会加载。

补充:上面这段结论源自于我大半年前的测试,本文评论中的 ayanamist
同学反馈现状已经有所变化。我又做了一些测试,果然随着操作系统的升级,移动浏览器都开始遵循混合内容规范了。最新测试表明,对于 Blockable 类混合内容:

  • iOS 9 以下的 Safari,以及 Android 5 以下的 Webview,默认会加载;
  • Android 各版本的 Chrome,iOS 9+ 的 Safari,Android 5+ 的
    Webview,默认不会加载;

一般选择了全站 HTTPS,就要避免出现混合内容,页面所有资源请求都走 HTTPS
协议才能保证所有平台所有浏览器下都没有问题。

合理使用 CSP

CSP,全称是 Content Security
Policy,它有非常多的指令,用来实现各种各样与页面内容安全相关的功能。这里只介绍两个与
HTTPS 相关的指令,更多内容可以看我之前写的《Content Security Policy
Level 2
介绍
》。

合理使用 CSP

CSP,全称是 Content Security
Policy,它有非常多的指令,用来实现各种各样与页面内容安全相关的功能。这里只介绍两个与
HTTPS 相关的指令,更多内容可以看我之前写的《Content Security Policy
Level 2 介绍》。

block-all-mixed-content

前面说过,对于 HTTPS 中的图片等 Optionally-blockable 类 HTTP
资源,现代浏览器默认会加载。图片类资源被劫持,通常不会有太大的问题,但也有一些风险,例如很多网页按钮是用图片实现的,中间人把这些图片改掉,也会干扰用户使用。

通过 CSP
的 block-all-mixed-content 指令,可以让页面进入对混合内容的严格检测(Strict
Mixed Content Checking)模式。在这种模式下,所有非 HTTPS
资源都不允许加载。跟其它所有 CSP
规则一样,可以通过以下两种方式启用这个指令:

HTTP 响应头方式:

JavaScript

Content-Security-Policy: block-all-mixed-content

1
Content-Security-Policy: block-all-mixed-content

<meta> 标签方式:

XHTML

<meta http-equiv=”Content-Security-Policy”
content=”block-all-mixed-content”>

1
<meta http-equiv="Content-Security-Policy" content="block-all-mixed-content">

block-all-mixed-content

前面说过,对于 HTTPS 中的图片等 Optionally-blockable 类 HTTP
资源,现代浏览器默认会加载。图片类资源被劫持,通常不会有太大的问题,但也有一些风险,例如很多网页按钮是用图片实现的,中间人把这些图片改掉,也会干扰用户使用。

通过 CSP
的 block-all-mixed-content 指令,可以让页面进入对混合内容的严格检测(Strict
Mixed Content Checking)模式。在这种模式下,所有非 HTTPS
资源都不允许加载。跟其它所有 CSP
规则一样,可以通过以下两种方式启用这个指令:

HTTP 响应头方式:

  1. Content-Security-Policy: block-all-mixed-content

<meta> 标签方式:

  1. <metahttp-equiv="Content-Security-Policy"content="block-all-mixed-content">

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图