为网站添加https支持

2016-08-10 11:50:22 Blog

本来是完全不想上https,因为没什么必要,还影响访问速度。不过最近网站的访问似乎受到了某墙的干扰,且根据具体的表现来看,似乎是被关键词过滤了。

考虑到https可以加密,可以抵抗某墙的干扰,于是决定为我的博客添加https支持。

整个过程还是很简单的,我使用的是Let's Encrypt的免费证书,参考了Jerry Qu的Let's Encrypt,免费好用的 HTTPS 证书这篇文章。

他使用的是acme-tiny这个开源软件进行自动化证书管理,很方便。不过他后面的都是以Nginx为例来进行操作的,而我前阵子把系统从CentOS 6换成了Ubuntu 14.04 LTS,服务器软件也从Nginx换成了Apache(使用了XAMPP套件)。

因此这里我把我在Apache上的配置过程记录下来。

创建账户私钥

首先创建一个目录,用来存放所有的密钥文件。

我用的是root账号登录的,于是就在root目录下创建了一个ssl文件夹~/ssl,也就是/root/ssl

之后就是创建账户密钥了,命名为account.key,具体命令如下:

openssl genrsa 4096 > account.key

这个密钥是用来给Let's Encrypt网站验证身份的。

创建CSR文件

下面的步骤就是为生成SSL证书做准备了。

首先用下面的命令生成域名密钥。

openssl genrsa 4096 > domain.key

之后生成CSR文件,这里要将需要SSL的域名填进去,以我的网站为例,我将顶级域名和www域名都添加了进去。

openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:fanzheng.org,DNS:www.fanzheng.org")) > domain.csr

域名验证

在Let's Encrypt进行证书签发之前,需要对我们的网站验证所有权。具体来说,他会访问网站的/.well-known/acme-challenge/目录来查看有没有他要求的文件。

在这里,我们只需在网站根目录下创建该文件夹即可。

创建证书

首先,下载acme-tiny自动化证书管理脚本。

wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py

接着,指定账户密钥、域名密钥以及验证网站所有权时使用的目录。

python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /opt/lampp/htdocs/.well-known/acme-challenge/ > ./signed.crt

最后,需要将中间证书和网站证书合并:

wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem

这样,我们最终的证书就是chained.pem

开启Apache的SSL支持

找到httpd-ssl.conf文件,修改SSLCertificateFileSSLCertificateKeyFile即可,其他都无需修改。

具体来说,修改为SSLCertificateFile "/root/ssl/chained.pem"SSLCertificateKeyFile "/root/ssl/domain.key"即可。

配置证书自动更新

由于Let's Encrypt的证书有效期只有90天,因此需要定期更新。下面的脚本其实就是上面的命令合在了一起,加上了重启xampp的一个自动化方案,每90天执行一下即可,使用crontab进行定期执行也可以。

cd /root/ssl/
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /opt/lampp/htdocs/.well-known/acme-challenge/ > ./signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat signed.crt intermediate.pem > chained.pem
/opt/lampp/xampp restart

设置网站重定向

现在最后一个步骤就是将原本的http重定向至https。我们在网站根目录下创建一个.htaccess文件,在里面写上重定向规则即可。

具体到我的网站,就是:

RewriteEngine On
RewriteCond %{SERVER_PORT} 80
RewriteRule ^(.*)$ https://fanzheng.org/$1 [L,R=301]

RewriteCond %{HTTP_HOST} ^www.fanzheng.org$ [NC]
RewriteRule ^(.*)$ https://fanzheng.org/$1 [L,R=301]

意思是将所有80端口的访问重定向到https的顶级域名,且将所有的www域名的访问也都重定向到https的顶级域名。

如果长时间无法加载评论,请对 *.disqus.com 启用代理!