站长资讯网
最全最丰富的资讯网站

在 Ubuntu 18.04 上使用 Let’s Encrypt 来保护 Nginx

Let’s Encrypt 是由 Internet Security Research Group(ISRG)开发的免费开放证书颁发机构。 今天几乎所有浏览器都信任 Let’s Encrypt 颁发的证书。

在本教程中,我们将提供有关如何使用 Ubuntu 18.04 上的 certbot 工具使用 Let’s Encrypt 来保护您的 Nginx 的分步说明。

准备条件

在继续本教程之前,请确保您已满足以下先决条件:

  • 您有一个指向公共服务器 IP 的域名。 在本教程中,我们将使用 example.com。
  • 您按照这些说明安装了 Nginx 。
  • 您有一个适用于您的域的服务器块。 您可以按照本文获取有关如何创建一个的详细信息。

安装 Certbot

Certbot 是一个功能齐全且易于使用的工具,可以自动完成获取和更新 Let’s Encrypt SSL证书以及配置Web服务器以使用它们的任务。 certbot 包包含在默认的 Ubuntu 存储库中。

更新软件包列表并安装 certbot 软件包:

sudo apt update  sudo apt install certbot

生成强Dh(Diffie-Hellman)组

Diffie-Hellman 密钥交换(DH)是一种在不安全的通信信道上安全地交换密码密钥的方法。 我们将生成一组新的 2048 位 DH 参数以加强安全性:

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

如果您愿意,可以将大小更改为 4096 位,但在这种情况下,生成可能需要超过 30 分钟,具体取决于系统熵。

获取Let’s Encrypt SSL证书

要获得我们域的 SSL 证书,我们将使用 Webroot 插件,该插件通过在 ${webroot-path}/。熟知 /acme-challenge 目录和Let的加密中为请求的域创建临时文件来工作。 验证服务器发出 HTTP 请求以验证所请求域的DNS是否解析为运行 certbot 的服务器。

为了使它更简单,我们将把 .well-known/acme-challenge 的所有 HTTP 请求映射到单个目录 / var/lib/letsencrypt

以下命令将创建目录并使其可以为 Nginx 服务器写入。

mkdir -p /var/lib/letsencrypt/.well-known  chgrp www-data /var/lib/letsencrypt  chmod g+s /var/lib/letsencrypt

为避免重复代码,请创建以下两个片段,我们将在所有Nginx服务器块文件中包含这些片段。

打开文本编辑器并创建第一个片段 letsencrypt.conf

sudo nano /etc/nginx/snippets/letsencrypt.conf

/etc/nginx/snippets/letsencrypt.conf

location ^~ /.well-known/acme-challenge/ {    allow all;    root /var/lib/letsencrypt/;    default_type "text/plain";    try_files $uri =404;  }

创建第二个代码段 .conf,其中包括 Mozilla 推荐的削片机,支持 OCSP Stapling,HTTP 严格传输安全(HSTS)并强制执行少数以安全为中心的 HTTP 头。

sudo nano /etc/nginx/snippets/ssl.conf

/etc/nginx/snippets/ssl.conf

ssl_dhparam /etc/ssl/certs/dhparam.pem;  ssl_session_timeout 1d;  ssl_session_cache shared:SSL:50m;  ssl_session_tickets off;    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;  ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';  ssl_prefer_server_ciphers on;    ssl_stapling on;  ssl_stapling_verify on;  resolver 8.8.8.8 8.8.4.4 valid=300s;  resolver_timeout 30s;    add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";  add_header X-Frame-Options SAMEORIGIN;  add_header X-Content-Type-Options nosniff;

创建片段后,打开域服务器块并包含 letsencrypt.conf 片段,如下所示:

/etc/nginx/sites-available/example.com

server {    listen 80;    server_name example.com www.example.com;      include snippets/letsencrypt.conf;  }

重新加载 Nginx 配置以使更改生效:

sudo systemctl reload nginx

您现在可以使用 webroot 插件运行 Certbot 并通过发出以下命令获取 SSL 证书文件:

sudo certbot certonly --agree-tos --email admin@example.com --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com

如果成功获得 SSL 证书,certbot 将打印以下消息:

IMPORTANT NOTES:   - Congratulations! Your certificate and chain have been saved at:     /etc/letsencrypt/live/example.com/fullchain.pem     Your key file has been saved at:     /etc/letsencrypt/live/example.com/privkey.pem     Your cert will expire on 2018-07-28. To obtain a new or tweaked     version of this certificate in the future, simply run certbot     again. To non-interactively renew *all* of your certificates, run     "certbot renew"   - Your account credentials have been saved in your Certbot     configuration directory at /etc/letsencrypt. You should make a     secure backup of this folder now. This configuration directory will     also contain certificates and private keys obtained by Certbot so     making regular backups of this folder is ideal.   - If you like Certbot, please consider supporting our work by:       Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate     Donating to EFF:                    https://eff.org/donate-le

现在您已拥有证书文件,您可以按如下方式编辑域服务器块:

sudo nano /etc/nginx/sites-available/example.com

/etc/nginx/sites-available/example.com

server {      listen 80;      server_name www.example.com example.com;        include snippets/letsencrypt.conf;      return 301 https://$host$request_uri;  }    server {      listen 443 ssl http2;      server_name www.example.com;        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;      ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;      ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;      include snippets/ssl.conf;      include snippets/letsencrypt.conf;        return 301 https://example.com$request_uri;  }    server {      listen 443 ssl http2;      server_name example.com;        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;      ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;      ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;      include snippets/ssl.conf;      include snippets/letsencrypt.conf;        # . . . other code  }

通过上面的配置,我们强制 HTTPS 并从 www 重定向到非 www 版本。

重新加载 Nginx 服务以使更改生效:

sudo systemctl reload nginx

自动续订让我们加密 SSL 证书

我们的加密证书有效期为90天。 要在证书过期之前自动续订证书,certbo t包会创建一个 cronjob,每天运行两次,并在到期前30天自动续订任何证书。

由于我们在续订证书后使用 certbot webroot 插件,因此我们还必须重新加载 nginx 服务。 将 –renew-hook“systemctl reload nginx”附加到 /etc/cron.d/certbot 文件,使其如下所示:

sudo nano /etc/cron.d/certbot
0 */12 * * * root test -x /usr/bin/certbot -a ! -d /run/systemd/system && perl -e ‘sleep int(rand(3600))’ && certbot -q renew –renew-hook “systemctl reload nginx”

要测试续订过程,可以使用 certbot –dry-run 开关:

sudo certbot renew --dry-run

如果没有错误,则表示续订过程成功。

总结

在本教程中,您使用了Let的加密客户端 certbot 来下载域的 SSL 证书。 您还创建了 Nginx 代码段以避免重复代码并配置 Nginx 以使用证书。 在本教程结束时,您已设置了一个用于自动证书续订的 cronjob。

如果您想了解有关如何使用 Certbot 的更多信息,他们的文档是一个很好的学习地方。

赞(0)
分享到: 更多 (0)