使用 Let's Encrypt 为站点添加 HTTPS

使用 Let's Encrypt 为站点添加 HTTPS


2018-09-19

有了 Certbot 以后,安装证书不能更简单。

  1. 访问 https://certbot.eff.org/ 选择自己使用的软件和系统,我选择的是 nginx 和 ubuntu。

  2. 然后就三步,第一步安装 Certbot;第二步安装证书,为了不再后续自己配置,直接在命令中带上自己的域名。命令如下:certbot --nginx certonly -d example.com,然后就是同意下一步。第三步就是设置证书定期更新了,更新证书命令是/usr/bin/certbot renew --dry-run -d example.com ,利用 crontab 每月一号更新证书,定时命令为:0 4 1 * * certbot renew --post-hook "systemctl restart nginx"(执行 crontab -e 加入这行命令)

  3. 接下里修改nginx的配置文件,这个地方我们需要借助mozilla提供的ssl配置文件生成器,网址为 https://mozilla.github.io/server-side-tls/ssl-config-generator/ ,注意选择正确的软件和版本,安全要求选择 Intermediate ,最后就生成了配置文件。

  4. 比如域名叫做 example.com ,按照 nginx default 的配置文件修改自己的配置文件。创建配置文件 /etc/nginx/sites-available/example.com ,将上一步得到的配置信息写入 example.com 的配置文件中。

  5. 配置文件中 ssl_trusted_certificate 一项配置多余,予以删除。需修改证书文件存放位置,主要是ssl_certificatessl_certificate_keyssl_dhparam三项。其中前两项位置为/etc/letsencrypt/live/example.com/目录下。然后在生成第三项配置文件,先创建文件夹mkdir -p /etc/nginx/ssl/,命令为openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048。至此三项配置为:

    1
    2
    3
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_dhparam /etc/nginx/ssl/dhparam.pem;

    之后修改域名和DNS:

    1
    2
    server_name example.com;
    resolver 8.8.8.8;

    对配置文件建立软连接到 site-enabled 文件夹 ln -s /etc/nginx/sites-available/example.com /etc/nginx/sites-enabled/,由于 nginx 配置会读这个文件夹下的配置文件,官方的规范也是如此,所以才这么做。

    然后编辑 /etc/nginx/nginx.conf 去掉 server_names_hash_bucket_size 的注释,默认值64即可。

    如果在此时重启nginx,一定会报错,为什么?因为default中也出现了:

    1
    2
    listen         80 default_server;
    listen [::]:80 default_server;

    所以在启动时一定会出错,有两个选择,一是删掉此example.com中80端口的server,将重定向写到default中;另外是禁用default配置,使用example.com配置,选择哪个需要自己选择。之后重启nginx,使用Qualys SSL Labs测试一下自己https分数,一般是 A+(图在底部,放在这里就是出不来……) 。

  6. 最后,设置代理。一般情况下我们使用nginx是做反向代理或负载均衡,无论是那种请求都要最终转发到我们的服务应用上,配置如下:

    1
    2
    3
    4
    5
    6
    7
    8
    location / {
    proxy_pass http://127.0.0.1:8080;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header Host $host:$server_port;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    }

附录,评分图: