在Ubuntu VPS Nginx上用Certbot获取免费SSL证书

从Let's Encrypt获取免费SSL证书是提升网站安全性最明智的决定。Certbot是一个功能强大的官方工具,专门用于自动化申请、安装和续期Let's Encrypt的SSL证书。本完整指南将逐步引导您在运行Nginx的Ubuntu VPS上安装Certbot,获取第一个SSL证书,并配置自动续期功能。

理解Certbot和Let's Encrypt

Let's Encrypt是一个非营利的认证中心,为全球任何人提供免费的SSL证书,目标是使加密连接成为互联网的默认方式。Certbot是由电子前沿基金会(EFF)创建的强大客户端软件,可以处理所有繁重工作——申请证书、验证域所有权、在Web服务器上安装证书,以及在过期前自动续期。

开始前的准备条件

为了确保顺利完成安装过程,请验证您具有以下所有要求:

第一步 — 安装Certbot和Nginx插件

Certbot可以在Ubuntu的标准包存储库中获得。首先更新包管理器缓存,然后安装Certbot和Nginx插件:

sudo apt-get update
sudo apt-get install -y certbot python3-certbot-nginx

软件包python3-certbot-nginx提供Nginx插件支持,允许Certbot自动修改Nginx配置文件并在正确位置安装SSL证书。没有此插件,您需要在获取证书后手动配置Nginx。

第二步 — 准备并验证Nginx配置

Certbot依靠您的Nginx配置来识别证书生成的正确域名。在申请证书前,确保Nginx配置文件包含适当的server_name指令:

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

您的配置应该如下所示:

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

编辑后,测试Nginx配置语法:

sudo nginx -t

输出应显示nginx: configuration file test is successful。如果看到错误,请在继续前仔细查看配置文件。

⚠️ 重要:Certbot使用server_name条目来确定证书应包含哪些域。不正确的server_name值将导致Certbot失败或为错误的域创建证书。

第三步 — 从Let's Encrypt申请SSL证书

现在您已准备好申请第一个SSL证书。Certbot将通过在您的Web根目录中创建临时文件来证明域所有权,Let's Encrypt服务器可以验证该文件。使用您的实际域名运行此命令:

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

Certbot会提示您输入电子邮件地址并接受Let's Encrypt服务条款。验证成功后,记下输出中显示的证书位置。它们通常位于:

/etc/letsencrypt/live/example.com/fullchain.pem
/etc/letsencrypt/live/example.com/privkey.pem

这些路径对于在下一步中配置Nginx很重要。

第四步 — 配置Nginx使用SSL证书

有了证书后,需要修改Nginx配置以使用它们。再次编辑服务器配置文件:

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

用处理HTTP和HTTPS流量的改进版本替换整个server块:

# 将所有HTTP流量重定向到HTTPS
server {
    listen 80;
    listen [::]:80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

# 主HTTPS服务器块
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name example.com www.example.com;

    # SSL证书路径
    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    # SSL安全设置
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

重新加载前测试配置:

sudo nginx -t

如果测试通过,重新加载Nginx应用更改:

sudo systemctl reload nginx

第五步 — 启用和配置自动续期

由于Let's Encrypt证书每90天过期一次,自动续期至关重要。Ubuntu提供systemd计时器每天运行Certbot。使用以下命令启用它:

sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

验证计时器是否处于活动状态:

sudo systemctl status certbot.timer

在不实际续期的情况下测试续期过程(验证设置):

sudo certbot renew --dry-run

如果没有错误,您的自动续期配置正确。Certbot现在每天检查一次,在过期前30天时续期证书。

第六步 — 验证SSL安装和测试功能

在Web浏览器中访问您的域,查找这些SSL安装成功的指示符:

如需详细的安全评估,使用Qualys SSL Server Test,访问https://www.ssllabs.com/ssltest/。输入您的域名并等待综合报告。此工具检查弱配置并给您的服务器打分。

💡 提示:切换到HTTPS后,更新您的sitemap.xml和robots.txt以使用HTTPS URL。还要更新网站内容中的任何内部链接以使用HTTPS。这可以帮助搜索引擎在HTTPS版本下正确索引您的网站。

高级:设置通配符SSL证书

如果您需要为所有子域名(*.example.com)提供SSL覆盖,可以申请通配符证书。这需要DNS域验证而不是HTTP验证:

sudo certbot certonly --manual --preferred-challenges=dns -d example.com -d *.example.com

Certbot将显示您需要添加到域DNS提供商的DNS TXT记录。过程如下:

  1. Certbot显示所需的TXT记录名称和值
  2. 登录您的DNS提供商(Cloudflare、Namecheap、GoDaddy等)
  3. 将TXT记录添加到您的DNS记录
  4. 返回Certbot并按Enter键验证
  5. Certbot验证域所有权并颁发通配符证书

证书随后将覆盖example.com、*.example.com和该主域下的任何其他子域。

故障排查常见问题

错误:"无法连接到续期服务器"

此错误表示连接问题。验证您的服务器具有互联网访问权限且DNS解析工作正常:

nslookup example.com
curl -I https://www.google.com

检查防火墙规则是否阻止到Let's Encrypt服务器的出站连接。

错误:"连接超时"或"连接被拒绝"

域的DNS A记录可能尚未指向您的VPS IP。使用以下命令验证:

dig example.com

如果ANSWER部分中的IP不匹配您的VPS,在域名注册商处更新DNS并等待24-48小时以传播。

端口80访问被拒绝

Certbot需要端口80开放用于验证检查。检查防火墙是否阻止:

sudo ufw status
sudo iptables -L -n | grep 80

如果被阻止,允许这些端口:

sudo ufw allow 80
sudo ufw allow 443
sudo ufw reload

证书尽管设置了自动续期仍然过期

检查续期计时器是否实际运行:

sudo journalctl -u certbot.timer -n 50

如果续期失败,检查续期日志:

sudo cat /var/log/letsencrypt/letsencrypt.log | tail -50

您可以强制立即续期:

sudo certbot renew --force-renewal

总结和最佳实践

使用Certbot在Nginx上安装SSL证书既简单又提供企业级加密,完全无需成本。通过遵循这六个步骤并设置自动续期,您确保您的网站始终具有有效的HTTPS保护。记住定期监控续期日志,并随着新安全改进的发布保持Certbot更新。您的网站访客将感谢HTTPS提供的额外安全性和改进的信任信号。

需要用于Certbot和Nginx设置的VPS?

AsiaGB提供具有完全root访问权限的Ubuntu VPS,非常适合SSL证书自动化和Web服务器管理。起价仅为500泰铢/月,提供99%的正常运行时间保证。

立即开始使用AsiaGB VPS

查看泰国VPS主机全部套餐 →