Certbot 申请 SSL 证书及 Nginx 配置方法

Eric 教程 392 次浏览 抢沙发

如今 HTTPS 已被广泛使用,如果网站还不支持。除了浏览器访问体验变差,还易被运营商流量劫持插广告。无论从设置难度或成本考虑,这些都已不是问题。通过申请 Let’s Encrypt 免费证书,为网站启用 HTTPS 支持只需简单几步。

下面介绍 Nginx 服务器下的 SSL 证书申请及配置指南。

安装 ACME 工具

获取 Let’s Encrypt 免费 DV SSL 证书非常容易,只需验证域名所有权即可申请,不用提供其它资料。

Let’s Encrypt 证书通过 ACME 协议申请,需要先安装一个 ACME 客户端操作,官方推荐用 Certbot

笔者使用 CentOS 系统,默认软件源里没有收录 Certbot,需要添加 EPEL 软件源扩展。

sudo yum -y install epel-release

运行下面命令安装 Certbot。

sudo yum -y install python2-certbot-nginx

Certbot 有两种工作方式:自动模式在申请 SSL 证书后会自动修改配置文件以启用 HTTPS,手动模式则只生成 SSL 证书,需要自行修改 Nginx 配置。下面两种方式都介绍下。

注意:使用 Certbot 申请证书前,先检查 Nginx 配置文件里是否有中文注释,如果有会提示下面错误。

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe6 in position 2: ordinal not in range(128)

Certbot 自动模式

一句命令搞定。红色字符部分是可选项,意思是不填写邮箱注册。

sudo certbot --nginx --register-unsafely-without-email

申请证书过程有几个交互问题,分别如下。

  • 输入电子邮箱,用于接收通知邮件;
  • 查看服务条款,输入 A 同意后注册;
  • 列出所有在 Nginx 配置里找到的域名,用列表数字选择(多个以空格隔开),不输入则选择全部;
  • 是否将 HTTP 访问重定向到 HTTPS,输入数字选择,1 表示不设置,2 表示设置;
  • 申请完后提示证书文件路径。这时已自动启用 HTTPS,访问网站试试;

Certbot 手动模式

运行下面命令申请 SSL 证书,若要接收 Let’s Encrypt 通知邮件则去掉红色参数。

sudo certbot --nginx --register-unsafely-without-email certonly

申请过程中的选项问题和上面自动模式一样,只是少了更新 Nginx 配置步骤。

在申请生成 SSL 证书后,手动编辑 Nginx 站点配置文件加入设置。

以下是一个示例(申请了根域名和 WWW 域名证书,并设置 HTTP 访问重定向。下面除了设置证书文件路径,SSL 相关参数直接引用 Certbot 提供的配置文件,蓝色字符部分)。

server {
    listen       80;
    listen       [::]:80;
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  example.com;
    return 301   https://www.example.com$request_uri;

    ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;
    include              /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam          /etc/letsencrypt/ssl-dhparams.pem;
}

server {
    listen       80;
    listen       [::]:80;
    server_name  www.example.com;
    return 301   https://www.example.com$request_uri;
}

server {
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    server_name  www.example.com;
    root         /var/www/www.example.com;
    index        index.html index.htm;

    ssl_certificate      /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/example.com/privkey.pem;
    include              /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam          /etc/letsencrypt/ssl-dhparams.pem;
}

完成上面设置后就可以用 HTTPS 访问了,默认设置通常可以得到 A 级评分。如果要进一步优化 SSL 配置,例如修改缓存时间,启用 HSTS 等。Mozilla 有一个在线配置生成工具可以用来参考,该工具要填写的软件版本号用下面命令查看:nginx -v查看 Nginx 版本,openssl version查看 OpenSSL 版本。

Certbot 自动续期

Let’s Encrypt 免费证书只有 90 天期限,需要设置自动续期。先用下面命令测试续期功能是否正常。

sudo certbot renew --dry-run

设置自动续期任务。新建一个 Service 单元文件,添加 SSL 证书续期命令,并在之后重载 Nginx 配置。

sudo vi /usr/lib/systemd/system/update_letsencrypt.service
[Unit]
Description=Renewal of Let's Encrypt's certificates

[Service]
Type=oneshot
ExecStart=/usr/bin/certbot renew --quiet --agree-tos
ExecStartPost=/bin/systemctl reload nginx.service

再创建相应的 Timer 定时文件(文件名需保持一致),以控制 SSL 证书续期服务何时运行。

sudo vi /usr/lib/systemd/system/update_letsencrypt.timer
[Unit]
Description=Monthly renewal of Let's Encrypt's certificates

[Timer]
OnCalendar=*-*-01 06:15:00
Persistent=true

[Install]
WantedBy=timers.target

上面设置每月 1 号凌晨 6 点 15 分执行一次更新。更多时间格式可以查看这个文档,参数选项则看这个

刷新配置,启动 Systemd Timer 并设置开机自启。

sudo systemctl daemon-reload
sudo systemctl start update_letsencrypt.timer
sudo systemctl enable update_letsencrypt.timer

到此就完成了 SSL 部署。证书更新日志在 /var/log/letsencrypt 目录(需切换 root 身份才能查看)。

也可以查看 Systemd 日志,命令 sudo journalctl -u update_letsencrypt

发表评论

电邮地址用于 Gravatar 头像显示,不会被公开可见。