我有一台运行 Ubuntu 20.04 的云服务器、一个配置到云服务器的域以及本地网络中的一台提供 HTTP 网站的服务器。我已成功将本地网络服务器 HTTP 网站隧道传输到云服务器 - 可通过端口 8080 在云服务器内部访问(8080 通过 ufw 在外部被阻止)。我已设置 apache2 以允许通过 apache /etc/apache2/sites-available/ 配置文件对隧道站点进行 HTTP 访问。我通过 ufw 允许云服务器使用 HTTPS,并希望让 certbot 为域生成有效的 HTTPS 证书和配置,该域通过隧道传输到内部网络服务器。
不幸的是,每次我尝试为 HTTPS 证书设置 certbot 时,它都要求我拥有/.well-known/acme-挑战/******* 文件在服务器上(它生成),并且失败;它无法在我的本地网络服务器上创建页面。我只有端口 80 转发到云服务器 - 而不是文件系统。我找到了一种手动运行 certbot 的方法,但仍然失败:certbot certonly --manual -d example.com
。
我能够通过端口 80 访问该网站,但我没有设置任何东西来成功查看 HTTPS 端口上的页面 - 我认为这就是 certbot 失败的原因。
我不确定纠正此问题的最佳方法。我只是想尝试其他方法,但我收到了“给定时间的请求过多::创建新订单时出错::最近授权失败次数过多” - 然后是 letsencrypt 速率限制的链接。所以,看起来我还有一个小时才能再试一次 - 我想确保下次我能做对。我还有一些域需要以这种方式设置,所以我想提高效率。我可以想象也许可以通过 sshfs 临时安装服务器文件系统来用于 certbot,但我想要一种更快的方法......
有什么提示或建议,或者我的配置存在明显问题吗?
答案1
这里有两个选项:
- 将 ACME 挑战文件放在本地服务器的
/.well-known/acme-challenge
目录中。
- 在您的云服务器中运行
certbot certonly --manual -d example.com
命令以获取挑战文件名和内容。不要继续使用 certbot。 <webroot>/.well-known/acme-challenge
在本地服务器的目录中创建包含内容的文件。- 验证您可以
http://example.com/.well-known/acme-challenge
从云服务器加载。 - 按 Enter 键继续进入 certbot。
完成这些步骤后,LE 服务器应该能够验证您的质询,并且 certbot 会将证书文件放在/etc/letsencrypt/live/example.com
目录下。
这种方法的缺点是自动更新功能不起作用,因为在云服务器上运行的 certbot 无法更新本地服务器上的挑战文件。
- 将ACME挑战文件放在您的云服务器上,并在虚拟主机中配置特殊目录。
在这种情况下,您需要更改云服务器虚拟主机配置,以便/.well-known/acme-challenge
目录由云服务器的文件系统提供。遗憾的是,我无法提供详细的步骤。
完成此设置后,certbot 的自动验证功能就可以正常工作了。
Letsencrypt 在任何时候都不需要与 HTTPS 通信。事实上,由于目前还没有证书,这种通信是不可能的。