今天给博客配置了一下HTTPS, 稍微记录一些步骤。
我博客的VPS是DigitalOcean上ubuntu16.04。
选择证书签发服务(Certificate Authority)
首先选择了 Let’s Encrypt 了, 这是由ISRG(Internet Security Research Group) 提供服务, 来自美国加利福尼亚一个公益组织。主要的Sponsors里也有Mozilla, Goolge, Facebook等大厂。
申请证书我用的是 acme-tiny 这个工具。 按照上面的步骤一步步做下来就OK了。
可以在github上看到更多关于ACME 的内容
配置证书
Step1. 创建Let’s Encrypt账号所需的私钥
首先在用户目录下创建了文件夹https-ssl
,之后在这里存放各种证书文件。
openssl genrsa 4096 > account.key
Step2. 为域名创建CSR(certificate signing request)
Let’s Encrypt 使用的ACME协议需要一个CSR文件。NOTE: 你不能对account和domain使用同一个私钥。
为域名生成私钥:
openssl genrsa 4096 > domain.key
生成crs, 以下命令同时对www.yoursite.com 和 yoursite.com 生效。
openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:yoursite.com,DNS:www.yoursite.com")) > domain.csr
Step3. 创建challenges 文件
Let’s Encrypt需要对你的主机和域名进行验证。 你需要保证它可以访问到.well-known/acme-challenge/
这个url路径。 NOTE:Let’s Encrypt 使用的是HTTP 请求(80端口),所以这些文件也必须能通过80端口访问到。
通过nginx 配置:
location /.well-known/acme-challenge/ {
alias /home/xxx/www/challenges/;
try_files $uri =404;
}
创建challenge 文件夹
mkdir -p /home/xxx/www/challenges/
我的nginx 文件配置例子
server {
listen 80;
listen [::]:80;
server_name www.bucketzxm.me bucketzxm.me;
location /.well-known/acme-challenge/ {
alias /home/xxx/www/challenges/;
try_files $uri =404;
}
root /home/xxx/blog/public;
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
location / {
# First attempt to serve request as file, then
# as directory, then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
location images/ {
root /home/xxx/blog/public/images;
autoindex on;
try_files $uri $uri/ =404;
}
# SSL configuration
listen 443;
listen [::]:443
server_name bucketzxm.me, www.bucketzxm.me;
ssl on;
ssl_certificate /home/xxx/https-ssl/chained.pem;
ssl_certificate_key /home/xxx/https-ssl/domain.key;
ssl_prefer_server_ciphers on;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA;
ssl_session_cache shared:SSL:50m;
ssl_session_timeout 5m;
ssl_session_tickets on;
}
Step4. 获取签名证书
下载acme-tiny 脚本到Step1中所创建的目录下/home/xxx/https-ssl
wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py`
运行python脚本
python acme_tiny.py --account-key ./account.key --csr ./domain.csr --acme-dir /var/www/challenges/ > ./signed.crt
Step5. 安装证书
先添加Let’s Encrypt的中间证书。
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
把中间证书和网站证书合并在一起
cat signed.crt intermediate.pem > chained.pem
(OPTIONAL)
为了之后启用OSCP Stapling, 把根证书和中间证书合并
wget -O - https://letsencrypt.org/certs/isrgrootx1.pem > root.pem
cat intermediate.pem root.pem > full_chained.pem
Step6. 重启nginx服务
可以通过命令service nginx restart
或者 service nginx reload
重新加载配置文件。(可以先用nginx -t
测试一下配置文件修改是否语法正确等)
之后访问网站应该就可以看到https的连接了。
Step7. 配置自动更新
因为Let’s Encrypt证书一次只能持续90天,所以需要90天续一次。把以下脚本添加到crontab任务中就可以了:
#!/usr/bin/sh
python /path/to/acme_tiny.py --account-key /path/to/account.key --csr /path/to/domain.csr --acme-dir /var/www/challenges/ > /tmp/signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > intermediate.pem
cat /tmp/signed.crt intermediate.pem > /path/to/chained.pem
service nginx reload
crontab -l
可以查看当前用户的定时任务
crontab example
0 0 1 * * /path/to/renew_cert.sh 2>> /var/log/acme_tiny.log
其它注意点
- 对于博客中的其它资源,例如图片等,访问方式也要变成https。否则会加载不出。
测试
以下几个网站可以用来测试安装正确性和网站的安全性等, ** 显然这个博客还需要改进…orz **
1. 测试chain是否正确
可以通过WhatsMyChaincert 来测试整个chain是否正确。
2. 测试安全性
2.1 Qualys SSL Lab’s SSL Server Test