内容提要
Let's Encrypt签发的证书有效期只有90天,更新证书时经常出问题。之前的做法是修改配置文件,但很麻烦。查看日志发现文件访问失败。尝试添加location解决,但失败。将location提到最前面后,再次尝试更新证书成功。为保险起见,https配置下也加入该路径。证书存放在指定路径。
延伸解读
证书更新失败的典型表现
文章中的 acme 日志显示,Let's Encrypt 的 http-01 验证请求返回 404,导致证书更新失败。这是因为域名配置了 HTTP 到 HTTPS 的 301 重定向,而 HTTPS 站点下没有对应的验证文件。读者遇到类似问题时,可以检查日志中是否出现“Invalid response”和“404”错误,这通常是验证文件无法访问的信号。
location 顺序为何关键
作者最初添加了 location /.well-known 但未生效,将同一段配置移到 server 块的最前面后成功。这说明 nginx 的 location 匹配顺序可能影响请求处理:更具体的匹配或正则匹配可能优先于普通前缀匹配。因此,确保验证路径的 location 不被其他规则覆盖,是解决此类问题的关键一步。
HTTPS 配置也需同步
由于 HTTP 会重定向到 HTTPS,验证请求最终会落到 HTTPS 端口。作者在 HTTPS 配置中也加入了相同的 location 路径,以确保验证文件可访问。读者在配置时,应同时检查 HTTP 和 HTTPS 的 server 块,避免因重定向导致验证失败。此外,需确保 /home/wwwroot/c.oba.by/.well-known 目录存在,否则 alias 可能无法正确提供文件。
Q&A
Let's Encrypt 证书为什么需要频繁更新?
Let's Encrypt 签发的证书有效期只有 90 天,因此需要定期更新。
nginx 使用 proxy_pass 转发时,更新证书失败通常是什么原因?
通常是因为证书验证文件(如 /.well-known/acme-challenge/ 下的文件)无法被访问,导致验证失败。常见原因是 HTTP 请求被 301 重定向到 HTTPS,而 HTTPS 配置中没有正确处理该路径,返回 404。
如何解决 nginx 下 Let's Encrypt 证书更新时的 404 错误?
在 nginx 配置中添加 location /.well-known { alias /home/wwwroot/c.oba.by/.well-known; },并确保该 location 放在配置文件的最前面(优先匹配)。同时,在 HTTPS 配置中也加入相同路径,并确保证书存放目录存在。
为什么将 location 提到最前面后证书更新就成功了?
因为 nginx 的 location 匹配顺序中,前缀匹配会按照配置中出现的顺序进行,将 /.well-known 的 location 放在最前面可以确保它优先于其他 location(如重定向规则)被匹配,从而正确提供验证文件。
证书更新成功后,证书文件存放在哪里?
证书文件存放在 /usr/local/nginx/conf/ssl/c.oba.by_ecc/ 目录下,包括 c.oba.by.cer(证书)、c.oba.by.key(私钥)、ca.cer(中间 CA 证书)和 fullchain.cer(完整链证书)。
除了 HTTP 配置,HTTPS 配置下也需要添加 /.well-known 路径吗?
是的,为了保险起见,HTTPS 配置下也建议加入相同的 location 路径,确保验证文件可以通过 HTTPS 访问。同时需要确保对应的目录 /home/wwwroot/c.oba.by/.well-known 存在,如果不存在则需要创建。