我最近(我认为是在 ServerFault、StackOverflow 或其他 StackExchange 论坛上)发现 Bitnami 堆栈提供了一个使用 Let's Encrypt 的工具,该工具显然使用了 certbot 以外的东西(叫做“lego”的东西,是吗?)。
我们在 AWS EC2 实例(原始 Amazon Linux)上运行了一个 Bitnami Trac/SVN 堆栈。我注意到,盒子上显然有两个单独的 httpd 实例;Bitnami 堆栈中的那个是活动的,托管 Trac 和 SVN。(几个月前,我启动了另一个,与尝试让 certbot 工作失败有关,可能已经将其保留了下来,但实际上它并没有做太多事情。)
Bitnami httpd 在端口 81 上设置了 HTTP(目前无法从外部访问),在端口 8000 上设置了 HTTPS(可访问),并且当前正在使用来自 Comodo 的证书,该证书将于 7 月到期。
我不记得 Bitnami 堆栈中 httpd 的原始“交付”端口配置是什么。
我一直在阅读这个“bncert-tool”的说明,不知道它是否适用于我们的设置。从我对 certbot 的失败实验来看,我以为 Let's Encrypt 期望在 80 上找到打开的 http。
有人可以解释一下这个问题吗?
5 月 18 日更新
当我真正有时间投入这个项目时,我终于想起了这个项目。我将实例克隆到一个现货实例,然后 (1) 禁用 Linux 自带的“库存” httpd,(2) 将 Bitnami 堆栈中的 httpd 更改为在 80 上监听。当我运行 bncert-tool 时,我得到了以下信息:
使用 Let's Encrypt 创建证书时发生错误:
acme: Error -> One or more domains had a problem:
[test.wintouch.net] acme: error: 403 :: urn:ietf:params:acme:error:unauthorized
:: Cannot negotiate ALPN protocol "acme-tls/1" for tls-alpn-01 challenge, url:
怎么办?
(我已保存日志文件。)
5 月 22 日更新
我突然想到,由于服务器当前的配置,无法访问任何事物无需密码。
所以我尝试了另一个现货实例。经过一番折腾,我将其配置为无需密码即可监听 80 端口,并在该端口上提供静态页面,远离 SVN 和 Trac 数据。
但结果和以前完全一样。和以前一样,我终止现货请求并删除 Route 53 A 记录作为清理工作的一部分。
经过一天的实验后,我研究了如何设置我的 Spot 实例,无论我使用什么设置原始实例,并发现了一些相当奇怪的事情:我能看到的所有 Bitnami SVN 和 Trac AMI 都是 Debian 或 Ubuntu。但这在 Amazon Linux 上(原始版本,不是 Amazon Linux 2)。因此,要么它来自不再存在的 AMI,要么我从“原始”Amazon Linux AMI 启动实例,然后在其上安装 Bitnami SVN/Trac 堆栈。
我会注意到,包括 bncert-tool 在内的堆栈确实不是位于 /opt/bitnami,但位于 /opt/trac-1.2.3-11
因此,由于无法检查“交付时”的配置,我四处张望,想知道 bncert-tool 使用什么来查找堆栈,最终我找到了 /opt/trac-1.2.3-11/properties.ini
hostname=
[Support]
installed_components=apache
apache_logs=apache{,2}/logs/error*log logs/error_log
apache_conf=apache{,2}/conf/{*.conf,bitnami/*.conf} etc/httpd.conf apps/*/conf/ht*.conf
apache_acl=apache apache2
[Apache]
apache_server_port=81
apache_user=daemon
apache_group=daemon
apache_server_ssl_port=443
apache_root_directory=/opt/trac-1.2.3-11/apache2
apache_htdocs_directory=/opt/trac-1.2.3-11/apache2/htdocs
apache_domainname=ip-172-31-8-195.us-east-2.compute.internal
apache_configuration_directory=/opt/trac-1.2.3-11/apache2/conf
apache_version=2.4.39
[Subversion]
subversion_port=3690
subversion_root_directory=/opt/trac-1.2.3-11/subversion
自安装以来,它看起来没有变化(/opt/trac-1.2.3-11 中的所有内容都有 2019 年 6 月 6 日的日期戳)。
可能是 bncert-tool 使用了那个配置文件,并且已经是告诉 Let's Encrypt 使用端口 81 而不是 80?
我要指出的是,与上述配置文件相反,httpd 的 Bitnami 实例在 8000 而不是 443 上侦听 SSL/TLS,Tomcat 服务器(独立于 Bitnami 堆栈)在 8443 上侦听(并在 netstat -l --numeric-ports 中显示为)8443,通过 iptables 映射到 443,并且没有什么直接监听端口 443。
答案1
Bitnami 工程师在这里,
您说得对。Bitnami HTTPS 配置工具使用 Lego,这是一个用 Go 编写的 Let's Encrypt 客户端。我们的工具使用端口 80 启动 lego 服务器(供 Let's Encrypt 验证),因此该端口应该可以从您的网络外部访问。如果不是这种情况,您将需要使用其他工具(您可以直接使用 lego)并设置要用于执行验证的端口。例如,您可以下载 lego 工具并尝试通过运行以下命令使用端口 81:
cd /tmp
curl -Ls https://api.github.com/repos/xenolf/lego/releases/latest | grep browser_download_url | grep linux_amd64 | cut -d '"' -f 4 | wget -i -
tar xf lego_v3.6.0_linux_amd64.tar.gz
sudo mkdir -p /opt/bitnami/letsencrypt
sudo mv lego /opt/bitnami/letsencrypt/lego
sudo /opt/bitnami/ctlscript.sh stop
sudo /opt/bitnami/letsencrypt/lego --http --http.port 81 --email="EMAIL-ADDRESS" --domains="DOMAIN" --domains="www.DOMAIN" --path="/opt/bitnami/letsencrypt" run
这应该会生成一个新证书。稍后您需要在 Apache 的配置中配置它们。您可以在此处找到更多信息
https://docs.bitnami.com/aws/how-to/generate-install-lets-encrypt-ssl/#alternative-approach
答案2
我最终使用了 Martos 先生提供的链接中的“替代方法”,并做了说明中未提到的一些更改:
如果涉及端口映射(例如,通过 iptables,8443 从外部显示为 443),则尝试向 lego 调用添加参数“--http.port :80 --tls.port :8443”(或您的映射所需的任何参数)。添加这些参数后,Lego 即可完美运行。另请注意,使用 Lego 时关闭服务器非常重要:它需要短暂接管端口。
此外,如果您随后需要将证书提供给 Tomcat 服务器,而 Tomcat 拒绝了它们,您可以使用 openssl 将它们转换为 PKCS12 密钥库(这要感谢 Tomcat 开发人员 Christopher Schultz,他在 Tomcat 用户列表服务器上),这对于 Tomcat 来说更容易处理。