从2018年年底开始,谷歌浏览器Chrome对于http://
站点将显示不安全的标志。所以最近终于开始琢磨SSL证书的事,让自己的网站不再显示不安全。
一、证书申请
对于个人站点而言,当然首选免费的SSL证书,毕竟财力有限,况且用户和数据也相对较少,要求略低。因为ECS服务器用的是阿里云,所以证书首先想到的也是他家。
阿里云申请证书有两种途径,一种是通过控制台中SSL首页免费购买,还有一种通过域名管理开启SSL。
相对而言,第二种会简便些,因为点击之后就可以直接填写域名。
在申请证书页面,选择DV SSL证书(免费版)。
这里需要提醒的是,只有收费证书才适合通配符*,所以如果你像我一样拥有好几个二级域名的话,只能一个个申请。只有一个主站的话,填写www就可以了。
点击申请后,页面提示申请成功。
进入到证书控制台首页后,会出现刚刚你申请的免费SSL信息卡。
继续点击申请按钮。
如果这个时候你回到域名解析的页面,会发现多了一条解析内容。这也是下一步验证所需要的,阿里云已经帮你自动填写好了。
点击验证,提示验证成功。
验证需要一定的时间,所以如果你申请后马上点验证,可能会出现验证失败的情况,此时需要耐心等待几分钟。
接下去又是耐心等待的时刻,大约十分钟左右(时间不一定,而且首次申请可能花费的时间会长一点)证书就下来了。
点击下载后,系统会让你选择服务器类型,此处我选择nginx。
打开下载的压缩包后,你会发现有两个扩展名为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打头的。
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的修改是最方便的,直接通过后台就可以了,具体见下图。
6. BookStack
BookStack其实有两个,一个是国外的BookStackApp,还有一个是国产的BookStack,两者的名字一样但不是一回事。这里指前者。
同样是修改配置文件,名称为.env
,找到APP_URL
,取消注释,修改如下:
APP_URL=https://你的网站域名
四、最后
至此全站的所有网站均升级成为了HTTPS。