新年的第一篇博客,感谢正在阅读的你。新年快乐!新年新气象,由于种种原因,我最后下定决心把博客整体迁移到 HTTPS 。简单记录一下过程。

申请的是 StartSSL 的免费版证书。体验很一般。整个网站响应缓慢,界面一股十年前的风格,还动不动丢失 session 必须重新来过,周末晚上也不提供服务。一开始使用了宿舍地址,被拒绝;人工沟通后被告知要使用个人的永久地址,折腾了好几次才办下来。不过也因此确定了一件事情:整个验证服务很多关键点上都是客服人工操作,直接回复发验证码过来的那个邮箱竟然在很短时间内就收到了客服的答复(赞一下效率)。不过还是觉得,有些地方明显是可以程序自动化的,期待今年夏季要上线的 Let’s Encrypt 。另外,鉴于 StartSSL 的用户体验,愿意掏一点点钱的话,可以去 namecheap 买最便宜的那个证书,一年也只要10刀,省心不少。

部署的话网上有很多文档了。首先(或者说,应该在申请证书的时候)应该自己先搞清楚一些公私钥体系的基本概念:根证书、 CA 、服务器证书、服务器私钥这些是什么东西。简单来说 HTTPS 的核心是一个公私钥加密系统,私钥必须保密存放在服务器上,公钥(证书)会被服务器传送给客户端使用。为了确保这一对密钥真的属于这个服务器,还构建了一套信用体系:浏览器内置了若干 Root CA ,这些 CA 可以信任(签署)其他下级 CA 或者是某个服务器证书。浏览器拿到服务器发来的证书时就会检查这个信任链。如果任何一环的签署有问题(甚至干脆就是自己给自己签发的),就会变成“不可信证书”。

具体设置方面, StartSSL 上的文档建议仅供参考,多看看 Apache 和 Nginx 的官方文档。尤其是如果使用 Apache 2.4 的话,各种设置有一些微妙区别。这里记几个要点:

  • 在服务器配置中需要指定各个证书、密钥文件的位置,搞清楚概念,一般说 Certificate 指的就是公钥、证书(习惯上用 .crt 后缀名,注意看清是要 CA 的证书还是你服务器的证书);说 (Certificate)Key 就是服务器私钥(习惯上用 .key 后缀名, CA 的私钥不可能给你)。
  • 还需要指定 CA 证书,准确说是要指定信任链上的各个 CA 的证书。如果不指定的话,一般默认在服务器系统的可信 CA 里寻找,是能找到 StartSSL 的根证书的,但是不会有 StartSSL 用来给免费证书签署的次级 Class 1 证书(整个链应该是 Root -> Class 1 -> Your Cert ),也就不会发送给客户端。这样一来在有些浏览器中就会因为信任链不完整而报错。最方便的办法是直接使用 Chained Certificate ,就是将 CA 证书按照信任链顺序直接文本拼接起来( Root 在上, Class 1 在下)。
  • 虽然我们一直混用 HTTPS 和 SSL 两个名词,但实际上 SSL 只是 HTTPS 众多实现中的一族协议而已,而且各个版本都有已知的安全漏洞, Chromimum 计划年内对使用 SSL 的站点发出警告。我们应该使用的是 TLS ,或者反过来用黑名单排除 SSL (v2和v3),在设置 SSLProtocol 的时候注意一下。
  • CipherSuite 是用来告诉 OpenSSL 可以使用(及优先使用)哪些加密算法的。 Again ,有关 cryptology 的事情都很麻烦。有些协议有或大或小的问题,有些协议又不被某个浏览器支持……简单的可以看 ServerFault 之类的问答平台上的推荐,严谨的可以看这个: Mozilla Server Side TLS (尤其参见 Prioritization logic 和 Mandatory discards 两个章节)。
  • HSTS 推荐打开。
  • 强制重定向参见 Apache 文档示例

设置好以后可以用 SSL Labs 检测一下。

最后是 WordPress 自己。首先需要在站点设置里把站点 URL 都加上 https 。其次需要修改以往发表的文章中的内链(包括插入的图片之类)。这一点没有什么方便的做法,直接打开数据库暴力替换吧(记得备份):

1
UPDATE `<your prefix>_posts` SET post_content=(REPLACE (post_content, 'http://[domain name]', 'https://[domain name]'));

打开博客主页,开启浏览器调试工具,看看有没有报错。新版 Firefox 默认是禁止加载 HTTPS 页面中的非加密资源,并且会在控制台里看到相关错误。一般这时候还会看到一两个,多是主题、插件的某个配置项甚至是 hard coded 的 URL ,修改一下相应地方。如果有使用 wp-super-cache 之类的缓存插件的话,记得点一下清空缓存(不要手动删除 cache 文件夹,会同时把 .htaccess 也删掉的)。

如果还有注册过 Google Analytics 或者其他的各种站长工具的话,记得也去改一下地址。然后重新提交一下 sitemap 。