从2018年年底开始,谷歌浏览器Chrome对于http://站点将显示不安全的标志。所以最近终于开始琢磨SSL证书的事,让自己的网站不再显示不安全。

一、证书申请

对于个人站点而言,当然首选免费的SSL证书,毕竟财力有限,况且用户和数据也相对较少,要求略低。因为ECS服务器用的是阿里云,所以证书首先想到的也是他家。
阿里云申请证书有两种途径,一种是通过控制台中SSL首页免费购买,还有一种通过域名管理开启SSL。
相对而言,第二种会简便些,因为点击之后就可以直接填写域名。
aliyun-ssl-step1.png
在申请证书页面,选择DV SSL证书(免费版)。
这里需要提醒的是,只有收费证书才适合通配符*,所以如果你像我一样拥有好几个二级域名的话,只能一个个申请。只有一个主站的话,填写www就可以了。
aliyun-ssl-step2.png
点击申请后,页面提示申请成功。
aliyun-ssl-step3.png
进入到证书控制台首页后,会出现刚刚你申请的免费SSL信息卡。
继续点击申请按钮。
aliyun-ssl-step4.png
如果这个时候你回到域名解析的页面,会发现多了一条解析内容。这也是下一步验证所需要的,阿里云已经帮你自动填写好了。
aliyun-ssl-step5.png
点击验证,提示验证成功。
验证需要一定的时间,所以如果你申请后马上点验证,可能会出现验证失败的情况,此时需要耐心等待几分钟。
aliyun-ssl-step6.png
接下去又是耐心等待的时刻,大约十分钟左右(时间不一定,而且首次申请可能花费的时间会长一点)证书就下来了。
aliyun-ssl-step7.png
点击下载后,系统会让你选择服务器类型,此处我选择nginx。
aliyun-ssl-step8.png
打开下载的压缩包后,你会发现有两个扩展名为key和pem的文件,这就是我们需要的证书文件了。

二、证书安装

接下去,你可以根据阿里云的安装教程进行,将证书文件复制到nginx下的cert目录下(该目录你可以根据实际情况自行决定,只要在稍后修改配置文件时准确填写位置就成)。
阿里云教程中的内容是初始化服务器时的配置,打开nginx.conf,然后找到:

# HTTPS server
# #server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
#
#
#}
#}

将其修改为:

server {
  listen 443;
  server_name localhost;
  ssl on;
  root html;
  index index.html index.htm;
  ssl_certificate   cert/a.pem;
  ssl_certificate_key  cert/a.key;
  ssl_session_timeout 5m;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  location / {
     root html;
     index index.html index.htm;
  }
}

如果你的配置文件正好符合,那么就按照官方的来好了。但是通常我们很少能够找到这么合适的。
因为我的ECS上有不同的虚拟主机用于运行不同的系统,并且大都以二级域名的形式,所以每个子站点都有独立的配置文件。此处以子站test.mindseed.cn(虚构)为例。
通常配置文件会以这样的形式开头:

server {
  listen 80;
  server_name test.mindseed.cn; 
  access_log /vhost/test.mindseed.cn_nginx.log combined;
  index index.html index.htm index.php;
  root /vhost/test.mindseed.cn;
  ……
}

其实网上有很多方法提到安装SSL证书,对于配置文件的修改也有很多。具体也可以参考nginx的官方说明
如果你希望直接使用https,不再留恋http,那么直接替换80端口为443端口,修改如下;

server {
  listen 443 ssl;
  server_name test.mindseed.cn; 
  access_log /vhost/test.mindseed.cn_nginx.log combined;
  index index.html index.htm index.php;
  root /vhost/test.mindseed.cn;
 
  #ssl on;
  ssl_certificate   /cert/test.mindseed.cn.pem;
  ssl_certificate_key  /cert/test.mindseed.cn.key;
  ssl_session_timeout 5m;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ……
}

上述做法并不保证一定能成功,至少我的Question2Answer访问时竟然跳到其他子站了。所以保险点可以保留监听80端口,直接在后面添加ssl的设置代码:

server {
  listen 80;
  listen 443 ssl;
  server_name test.mindseed.cn; 
  access_log /vhost/test.mindseed.cn_nginx.log combined;
  index index.html index.htm index.php;
  root /vhost/test.mindseed.cn;
 
  #ssl on;
  ssl_certificate   /cert/test.mindseed.cn.pem;
  ssl_certificate_key  /cert/test.mindseed.cn.key;
  ssl_session_timeout 5m;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ……
}

这样做正常情况并不会有太大问题,但是要添加重定向代码时就会发生错误了,随便放那里都可能导致浏览器提示重定向过多。
所以还是需要适当修改一下:

server {
  listen 80;
  server_name test.mindseed.cn;
}
server {
  listen 443 ssl;
  server_name test.mindseed.cn; 
  access_log /vhost/test.mindseed.cn_nginx.log combined;
  index index.html index.htm index.php;
  root /vhost/test.mindseed.cn;
 
  #ssl on;
  ssl_certificate   /cert/test.mindseed.cn.pem;
  ssl_certificate_key  /cert/test.mindseed.cn.key;
  ssl_session_timeout 5m;
  ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  ssl_prefer_server_ciphers on;
  ……
}

这应该算是比较保险的写法了,虽然多了几行代码,但能减少必要的麻烦。

三、强制开启HTTPS

强制开启HTTPS最简单的方法就是通过重定向方式转到HTTPS。
在上述代码中继续添加重写规则,如下:

server {
  listen 80;
  server_name test.mindseed.cn; 
  rewrite ^(.*)$  https://$host$1 permanent;
}

当然除了这种方式,各个系统也有自己的开启方式,下面逐一做简单介绍。

1. WordPress

使用率高就是好,随便在网上搜一下就有教程。可最终你会发现真的是五花八门,甚至还有很多仍停留在过去的老版本中。
首先也是最重要的就是在后台设置中将网站的URL改成HTTPS打头的。
wordpress-ssl.png

2. Question2Answer

都快把这个给忘了,之所以放在第二位是因为它的问题最大。直接导致我的WordPress主站500错误无法打开。因为当时为了让两个系统合并共用同一组用户而进行过特别设置,而就在我快把它给忘却时,它却来刁难我了。
还有一个很妖的问题也出现在它身上,就是如果不强制开启HTTPS的话,它竟然会在各个子站中乱窜。比方说ask.mindseed.cn是它的域名,可打开的有可能就是tech.mindseed.cn,太神奇了。而一旦加上HTTPS前缀之后又一切正常了。
网上找了一圈没有合适的答案,所以还是通过nginx的配置文件重定向到HTTPS。

3. typecho

国产系统,使用率也在逐渐上升,虽然更新慢但好歹按作者的意思,没烂尾。它也有个相对简便的方法,就是修改配置文件config.inc.php,在其中添加:

/** 开启HTTPS */
define('__TYPECHO_SECURE__',true);

4. MediaWiki

修改配置文件LocalSettings.php,找到$wgServer,修改如下:

## The protocol and server name to use in fully-qualified URLs
$wgServer = "https://你的网站域名";

5. LimeSurvey

LimeSurvey的修改是最方便的,直接通过后台就可以了,具体见下图。
limesurvye-ssl.png

6. BookStack

BookStack其实有两个,一个是国外的BookStackApp,还有一个是国产的BookStack,两者的名字一样但不是一回事。这里指前者。
同样是修改配置文件,名称为.env,找到APP_URL,取消注释,修改如下:

APP_URL=https://你的网站域名

四、最后

至此全站的所有网站均升级成为了HTTPS。

最后修改:2020 年 03 月 03 日
如果觉得我的文章对你有用,请随意赞赏