购买证书并在 WEB 服务器配置好 HTTPS 网站后,就可以进行具体的迁移操作了。其实非常简单,假如你的应用只是 API,只要让调用方修改下调用协议就可以了;假如你的应用是网页,相对来说繁琐一点。
加载的资源必须是 HTTPS
页面可能会以各种方式加载图片、CSS、JS 这样的元素,元素也有可能是外站的,请务必加载 HTTPS 协议的资源,这个时候你的应用程序就要进行大检查了,假如网站页面不多,可以通过 Chrome 开发者工具检查是否没有修改到位,见下面的图就能知道那些元素还不是 HTTPS 的:
![https chrome 工具][https_1]
[https_1]: http://notes.newyingyong.cn/static/image/2017/https_1.png "https chrome 工具"
假如在 HTTPS 页面嵌入 HTTP 元素,称之为 Mixed Content,假如是加载的是 JS 这样重要的元素,浏览器会直接阻止的,比如在控制台显示如下的提示 Mixed Content: The page at 'https://rss.newyingyong.cn/' was loaded over HTTPS, but requested an insecure script 'http://weibonotice.newyingyong.cn/static/js/jquery.js'. This request has been blocked; the content must be served over HTTPS
。而对于图片这样的 HTTP 元素,浏览器还是允许显示的。
总体上来说,开发者尽量去替换 HTTP 元素(尤其是 JS、CSS元素),有的网站是同时支持两个 HTTP 协议,所以在引入元素的时候,这样写 <script src="//rss.newyingyong.cn/static/js/jquery.js"></script>
如何让用户使用新的 HTTPS 网页
现在你在网站上全部部署了 HTTPS 网页,但是有的时候用户记住了你的 HTTP 网页,那么如何引导他进入 HTTPS 网页呢?可以有两种方式,第一就是通过 Nginx 的 Rewrite 规则,对 HTTP 协议的访问进行跳转,方法很简单:
server {
listen 80;
listen [::]:80;
server_name rss.newyingyong.cn;
return 301 https://rss.newyingyong.cn$request_uri;
}
第一种方法是服务器端控制方法,第二种方法是客户端控制方法,服务器可以发送一个 Header 头,告诉浏览器我这个网站有 HTTPS 协议,假如用户访问的是 HTTP 网页,请帮我转换下,这个头就是 Strict-Transport-Security,在 Nginx 上可以这样进行配置。
add_header Strict-Transport-Security max-age=15768000;
域名和证书
在 HTTP 时代,不管是顶级域名还是通配符域名本身和 HTTP 没有关系,只有 DNS 和 WEB 服务器能够支持就可以了,到了 HTTPS 时代,由于多了证书这个概念(和域名有关系),所以在迁移过程中必须考虑域名的问题。
就我理解的概念,小企业一般就一个主域名(也可称为顶级域名),比如 newyingyong.cn,然后可以使用多个二级域名,比如 rss.newyingyong.cn 和 weibonotice.newyingyong.cn ,后续可能还会新增新的二级域名,这时候应该选择域名通配符证书,另外尽量不要使用三级域名,因为通配符只支持无限多个二级域名。这也告诉我们架构设计的时候,我们在部署服务的时候一定要注意域名层级的选择。
对于大企业来说,可能有多个根域名,比如 rss.newyingyong.cn,rss.newyingyong.com,那么这时候可能就要选择多域名证书了,多域名下再支持通配符,可以看下新浪的域名证书。
#使用者
CN = sina.com
OU = Sina.com Technology(China)Co.,ltd
O = Sina.com Technology(China)Co.,ltd
L = Beijing
S = Beijing
C = CN
#使用者可选名称
DNS Name=sina.com.cn
DNS Name=*.video.sina.com.cn
未来对于大企业来说,证书统一管理也很重要,假如证书私自发送给每个服务的管理员,存在极大的风险。
如何引入外站内容和 CDN
假如页面引入的外部元素不支持 HTTPS,基本没有什么好的方法,只能推动所有网站升级到 HTTPS,另外为了增加安全性,当 HTTPS 降级访问 HTTP 内容的时候,默认会阻止传递 Refer 信息的,总体来说,未来的服务会越来越安全,对于一些做通用服务的企业来说,不支持 HTTPS 基本无法生存。
另外有些企业可能会使用第三方的 CDN,但是不可能将自己的私钥发送给第三方 CDN,所以在迁移过程中也要考虑这些问题,不过大部分 CDN 厂商都支持无私钥方案,由于自己个人站没有使用 CDN,所以相关经验优先,对于企业迁移 HTTPS 的时候,这也是需要注意的一个点。
robots.txt 和搜索引擎
虽然这两个知识和 HTTPS 没有直接的关系,但是在迁移过程中也需要注意。可以参考 Google 的相关资料,比如在 Search Console 中切换 HTTPS 域名,robots.txt 增加对于 HTTPS 的控制,另外 Google 一直在推进 HTTPS ,所以在收入的时候会优先考虑 HTTPS 网页,不过对于中国网站来说,影响并不大。
而百度站长平台对于 HTTPS 的说明并不多,对开发者来说启用 HTTPS 到底有多大好处并不知道。我们能做的就是考虑全面一点。
迁移面临的挑战
其实 HTTPS 迁移技术上没有太多的问题,更多的是权衡。大家思考几个问题:
1:新浪微博为什么不支持 HTTPS
因为它是个信息聚合网站,会嵌入很多外站内容,目前的情况是很多网站还没有 HTTPS,所以目前实施 HTTPS 肯定不可行。
2:新浪这样的门户网站为什么不能很好的支持 HTTPS
大家可以访问下 https://www.sina.com.cn ,浏览器会提示不安全,新浪门户有多年的历史,有完整的 CMS 系统,外部引入也非常多,有些资源的地址都是绝对路径,存储在数据库这样的持久化系统中,全面替换是非常难搞的一个工作,所以只能慢慢消化。
这里想说的并不是应不应该迁移的问题,而是对于某些网站来说迁移挺复杂,假如网站架构设计的好,那么迁移起来就非常简单。假如有很多历史包袱,那么这个过程会很痛苦。