为网站添加https支持
本来是完全不想上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
文件,修改SSLCertificateFile
和SSLCertificateKeyFile
即可,其他都无需修改。
具体来说,修改为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的顶级域名。