AWS EC例实例部署 Let’s Encrypt 免费 HTTPS 证书记录(Nginx 配置 + 排错解决)

在 AWS EC2 实例上部署 Let’s Encrypt 免费的 HTTPS 证书,是为网站提供安全、加密连接的一个非常重要的步骤。通过 Let’s Encrypt,你可以免费为你的域名配置 SSL/TLS 证书。这个过程通常涉及到在 EC2 上安装并配置 Nginx,以及使用 Certbot 来自动化证书的获取和续期。

步骤概览

  1. 准备工作:创建和配置 EC2 实例、域名解析(DNS)、安装 Nginx。
  2. 安装 Certbot:使用 Certbot 工具获取并安装 Let’s Encrypt 证书。
  3. 配置 Nginx:配置 Nginx 以使用 SSL/TLS 证书。
  4. 测试 HTTPS 连接:确认证书安装正确,并使用 HTTPS 访问站点。
  5. 排错解决:常见问题及其解决方法。

1. 准备工作

1.1 启动 AWS EC2 实例

  1. 登录到 AWS 控制台,创建一个 EC2 实例。你可以选择 Amazon Linux 2、Ubuntu 等操作系统,本文以 Ubuntu 20.04 为例。
  2. 配置安全组(Security Group):
    • 允许 HTTP(端口 80)和 HTTPS(端口 443)流量通过防火墙。
  3. 配置 Elastic IP(可选):如果你希望使用固定的 IP 地址访问实例,可以配置 Elastic IP。

1.2 域名解析

  1. 确保你有一个有效的域名(例如 example.com),并且已经将其指向你的 EC2 实例的公共 IP 地址。
  2. 配置 DNS 记录:在你注册域名的 DNS 提供商处,创建一条 A 记录,指向 EC2 实例的 IP 地址。

例如:

  • A 记录example.com -> 34.x.x.x (EC2 公共 IP) www.example.com -> 34.x.x.x

1.3 安装 Nginx

在 EC2 实例上安装 Nginx,以便托管你的网页。

sudo apt update
sudo apt install nginx -y

安装完成后,启动 Nginx 服务并使其开机自启:

sudo systemctl start nginx
sudo systemctl enable nginx

可以通过访问 EC2 实例的公共 IP 地址来验证 Nginx 是否正常工作。打开浏览器,访问 http://<EC2_PUBLIC_IP>,你应该会看到 Nginx 的默认欢迎页面。


2. 安装 Certbot

2.1 安装 Certbot 和 Nginx 插件

Certbot 是一个自动化工具,用于从 Let’s Encrypt 获取和管理证书。你可以使用 Certbot 的 Nginx 插件来简化 Nginx 配置过程。

首先,安装 Certbot 和 Nginx 插件:

sudo apt install certbot python3-certbot-nginx -y

2.2 获取证书

确保你的域名已经解析到 EC2 实例的 IP 地址,并且 Nginx 配置文件中的 server_name 指定了你的域名(如 example.com)。

运行以下命令,自动获取并配置 SSL 证书:

sudo certbot --nginx -d example.com -d www.example.com

Certbot 会要求你提供邮箱地址,并同意 Let’s Encrypt 的服务条款。完成后,它将自动执行以下操作:

  • 生成并安装 SSL 证书。
  • 自动修改 Nginx 配置文件,启用 HTTPS。
  • 设置自动续期任务(Cron 作业)。

2.3 自动续期配置

Certbot 会自动为你配置证书续期任务。你可以通过以下命令检查是否有续期任务配置:

sudo systemctl list-timers | grep certbot

若没有显示任何信息,你可以手动设置一个 cron 任务来定期检查证书是否过期:

sudo crontab -e

添加以下行:

0 0 * * * certbot renew --quiet

这会每天零点执行一次 Certbot 的续期命令。


3. 配置 Nginx

Certbot 自动修改了 Nginx 配置文件,使其支持 HTTPS 连接。如果你希望手动调整 Nginx 配置或启用 HTTP 到 HTTPS 的重定向,可以修改 Nginx 配置文件。

3.1 修改 Nginx 配置

Nginx 配置文件通常位于 /etc/nginx/sites-available/default 或 /etc/nginx/nginx.conf,具体路径取决于你的操作系统和 Nginx 配置。打开 Nginx 配置文件进行编辑:

sudo nano /etc/nginx/sites-available/default

确保你有类似以下的配置:

server {
    listen 80;
    server_name example.com www.example.com;

    # 自动重定向到 HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name example.com 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;

    # SSL 配置(可以参考最佳实践的配置)
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384';

    location / {
        # 你的网站根目录
        root /var/www/html;
        index index.html index.htm;
    }
}

在上面的配置中:

  • 第一个 server 块将所有 HTTP 请求重定向到 HTTPS。
  • 第二个 server 块配置了 SSL/TLS,并设置了 ssl_certificate 和 ssl_certificate_key 路径,它们指向由 Certbot 生成的证书和私钥文件。

3.2 检查配置并重新加载 Nginx

配置完成后,检查 Nginx 配置是否正确:

sudo nginx -t

如果配置文件没有问题,重新加载 Nginx:

sudo systemctl reload nginx

3.3 测试 HTTPS

现在,你可以通过访问 https://example.com 来测试 HTTPS 是否生效。如果一切配置正确,你将看到使用 Let’s Encrypt 证书的 HTTPS 站点。


4. 排错解决

4.1 Nginx 无法启动或证书配置失败

如果 Nginx 无法启动或者在配置 SSL 时遇到问题,请按照以下步骤进行排查:

  • 检查 Nginx 配置:确保 Nginx 配置文件没有语法错误:sudo nginx -t 如果返回错误信息,根据提示进行修复。
  • 检查证书文件路径:确保证书文件的路径正确。证书文件应该位于 /etc/letsencrypt/live/<domain>/ 目录下,包含以下文件:
    • fullchain.pem:包含证书和证书链。
    • privkey.pem:私钥文件。
    • chain.pem:证书链文件。
  • 检查防火墙设置:确保 EC2 实例的安全组设置允许 80 和 443 端口的访问。
    • 80 端口:HTTP(用于 Certbot 验证和 HTTP 重定向)。
    • 443 端口:HTTPS(加密的连接)。

4.2 Certbot 续期失败

如果 Certbot 续期失败,请查看日志:

sudo cat /var/log/letsencrypt/letsencrypt.log

常见的原因包括:

  • DNS 配置问题:域名没有正确解析到 EC2 实例的 IP 地址。
  • 防火墙问题:端口 80 或 443 被防火墙阻止,导致验证失败。

解决方法包括检查 DNS 记录、验证防火墙配置,并确保 Certbot 可以访问域名。


总结

通过 AWS EC2 实例配置 Let’s Encrypt 免费 HTTPS 证书的过程,可以为你的网站提供安全的加密连接。使用 Certbot 和 Nginx 插件,可以简化 SSL 证书的获取和配置过程。确保配置了自动续期功能,并及时检查日志和错误信息,以确保 HTTPS 服务的持续可用性。如果遇到问题,通过排错方法检查 Nginx 配置、证书路径、DNS 配置和防火墙设置即可解决。