文章

部署 Let's Encrypt 免费证书

1. 关于Let’s Encrypt

Let’s Encrypt 是一家SSL证书颁发机构。它的服务商提供了免费SSL证书。

https://letsencrypt.org

2. 关于Certbot

Certbot 是一款免费的开源软件工具,可在手动管理的网站上自动使用Let's Encrypt证书来启用 HTTPS。

https://certbot.eff.org

3. 使用Certbot为nginx部署免费SSL证书

3.1. 安装软件

  • nginx

  • certbot

  • python3-certbot-nginx

3.2. 配置nginx

  • 假设域名为:example.com

server {
  listen 80;
  listen [::]:80;
  server_name example.com;
  root /var/www/html;
  index index.html;
  location / {
    try_files $uri $uri/ =404;
  }
}
  • 重启nginx

sudo nginx -s reload
  • 配置为http服务,并确保外网通过域名可以访问到。

3.3. 运行certbot部署证书

sudo certbot --nginx -d example.com
  • 运行过程中需要填写一个邮箱,其它都输入Y即可。它将自动连接Let's Encrypt申请免费证书,并自动修改nginx的配置文件进行HTTPS服务的部署。

  • 执行成功后,nginx的配置文件内容变为:

server {
  server_name example.com;
  root /var/www/html;
  index index.html;
  location / {
    try_files $uri $uri/ =404;
  }

  listen [::]:443 ssl ipv6only=on; # managed by Certbot
  listen 443 ssl; # managed by Certbot
  ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
  ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
  include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
  ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
} 
server {
  if ($host = example.com) {
    return 301 https://$host$request_uri;
  } # managed by Certbot
  listen 80;
  listen [::]:80;
  server_name example.com;
  return 404; # managed by Certbot
}

3.4. 设置crontab,定时自动更新证书

免费证书有效期比较短,多数为90天,手动维护比较麻烦,所以设置一个定时任务,调用certbot自动更新证书。

  • 如果没有crontab命令,需要先安装cron软件

sudo apt install cron
  • 设置定时任务

sudo crontab -e

编辑保存定时任务规则:

0 0 1 * * /usr/bin/certbot renew --quiet

# 0 0 1 * * 意思是每个月的1日0点0分执行
# --quiet 参数让certbot不输出日志
# certbot会更新30天内到期的证书

License:  CC BY 4.0