零成本打造安全博客的简单办法

除了使用Let's Encrypt可以零成本打造安全的博客之外,这里介绍了另一种方法

Posted by figotan on April 26, 2016

昨天写了一篇介绍Let’s Encrypt实践的文章,但是我的博客是托管在第三方Pages平台的,比如Gitlab,那如何使用https呢?虽然Gitlab的博客里也提到了用Let’s Encrypt来做Pages网站的https化,但是过程稍微有些繁琐,比如生成证书的过程,而且最不方便的是,没有提供自动化更新证书的办法。

When you finish setting up, just put in your calendar to remember to renew the certificate in time, otherwise it will become invalid, and the browser will reject it.

这里笔者试验出另一种办法,如果你的博客是托管在Gitlab的Pages上的(Github和Coding.net的Pages目前并没有支持自定义域名的SSL设置),那么可以零(全)成(免)本(费)做一个https化的博客网站。

申请沃通免费证书

知乎上有一篇帖子,无意间介绍了两个提供免费证书的服务商,一个叫StartSSL,另一个是我现在用到的沃通SSL
在沃通申请免费证书很简单,步骤如下:

  1. 首次注册即可申请,访问申请免费SSL证书
  2. 依次输入证书需要绑定的域名,申请年限,证书语言,登录邮箱,密码,验证码,点击提交即可。
  3. 证书的生成需要递交CSR文件,目前支持两种,一是提供密码由沃通的后台系统自动生成,二是在自己的服务端生成然后手动上传。因为我自己没有服务端,所以选择第一种方式。
  4. 递交成功后就可以按照提示下载包含有证书和私钥文件的压缩包了,记住步骤3的密码,解压这个压缩包需要用到。如果证书丢失了,可以再次登录到沃通的web portal取回证书(但是密码一定要记得哦)。

证书格式转换

下载压缩包后,双击打开,输入密码,你会发现如下内容

  • for Apache.zip
  • for IIS.zip
  • for Nginx.zip
  • for Other Server.zip
  • for Tomcat.zip

根据不同的Web Server类型选择不同的子压缩包。那么问题来了,Gitlab的Pages采用的什么样的Web Server呢?用Chrome的开发者工具分析了下自己托管在Gitlab的Pages上的网站,然而并没有发现什么。然后想到Gitlab的Pages自定义域名那里是让用户手动输入证书内容的,所以它用什么Web Server不重要了。
但是这里,因为对Nginx比较熟悉,就解压看看里面是什么。
发现有两个文件,一个叫 1_subdomain.your_domain.com_bundle.crt,另一个叫2_subdomain.your_domain.com.key

crt是什么格式?去问了度娘,原来是证书的一种格式,但是Gitlab的Pages只支持pem(证书的另一种格式)格式的证书和私钥,所以一拍脑袋,需要做转换,于是,敲了如下命令做证书格式转换:

openssl x509 -in 1_subdomain.your_domain.com_bundle.crt -out 1_subdomain.your_domain.com_bundle.pem -outform PEM

1_subdomain.your_domain.com_bundle.pem的内容打印出来

cat 1_subdomain.your_domain.com_bundle.pem

然后将终端打印的内容贴到gitlab的pages设置自定义域名的地方(填写好域名,私钥的内容也打印并贴上),点击”Create New Domain“,然后Gitlab报错,提示证书格式出错。

这是什么鬼?难道1_subdomain.your_domain.com_bundle.crt不是真的crt格式?验证下,直接把1_subdomain.your_domain.com_bundle.crt2_subdomain.your_domain.com.key的内容打印并贴到Gitlab,点击”Create New Domain“,这次成功了!

由此得到一个教训,直接看后缀名就判断文件格式并不可靠,这里明明是pem格式的证书,后缀却是crt。

那么,如果获得一个文件的真正的格式呢?并没有找到类似的命令,但是发现一篇文章,可以用下面的办法判断

openssl x509 -in certificate.crt -text -noout

如果命令的输出有错误提示,那就不是pem格式的证书了。

Gitlab上设置证书

登录到Gitlab,选择pages所在的项目,点击”Settings”,然后点击”Pages”,点击”New Domain”,在下图中依次填入域名,证书(pem)和证书私钥(pem),然后点击”Create New Domain

去浏览器看看效果

打开浏览器看看你的网站,是不是多了一把小锁?那么恭喜你,你的博客已经https化了。

参考资料

Hosting on GitLab.com with GitLab Pages
Tutorial: Securing your GitLab Pages with TLS and Let’s Encrypt
那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)