0%

Let's Encrypt,博客添加HTTPS证书

今天给博客配置了一下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

其它注意点

  1. 对于博客中的其它资源,例如图片等,访问方式也要变成https。否则会加载不出。

测试

以下几个网站可以用来测试安装正确性和网站的安全性等, ** 显然这个博客还需要改进…orz **

1. 测试chain是否正确

可以通过WhatsMyChaincert 来测试整个chain是否正确。

2. 测试安全性

2.1 Qualys SSL Lab’s SSL Server Test

2.2 HTTP Security Report