一般设置如下:
我有一台具有公共 IP 地址的服务器(我将其称为前端机器),它运行 Nginx 并提供一些使用 Letsencrypt 证书保护的网页。
现在我们要添加一台新机器(我们称之为后端机器),运行另一个 webapp 和几个其他需要通过 Letsencrypt 的 SLL 证书保护的应用程序。该 webapp 由 Apache 提供服务,位于前端机器的反向代理后面的自己的子域中。
通常情况下,我只会在前端机器上终止 SSL,然后与后端机器进行 HTTP 通信,但在这种情况下,这是不可能的。后端机器必须是具有子域 SSL 证书的机器。所以我想我只需设置一个不添加任何标头的反向代理,即可将对该域的所有请求转发到后端服务器。我在前端机器上的 Nginx 配置如下所示:
#sub.domain.com
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name sub.domain.com;
error_log /var/log/nginx/subdomain.error.log;
location / {
# Fix the “It appears that your reverse proxy set up is broken" error.
proxy_pass https://192.168.11.3;
proxy_ssl_verify off;
proxy_read_timeout 90;
proxy_redirect https://192.168.11.3 https://sub.domain.com;
}
}
server {
listen 80;
listen [::]:80;
server_name sub.domain.com;
location / {
proxy_pass http://192.168.11.3;
proxy_read_timeout 90;
proxy_redirect http://192.168.11.3 http://sub.domain.com;
}
}
然后我尝试使用 letsencrypt 的“临时网络服务器”功能在后端机器上从 Letsencrypt 请求证书,但它给出了以下错误:
Domain: sub.domain.com
Type: unauthorized
Detail: Incorrect validation certificate for TLS-SNI-01 challenge.
Requested
{LONG TOKEN REMOVED}.acme.invalid
from XXX.XXX.XXX.XXX:443. Received 2 certificate(s), first
certificate had names "othersub.domain.com"
To fix these errors, please make sure that your domain name was
entered correctly and the DNS A record(s) for that domain
contain(s) the right IP address.
所以我的问题是:我该如何实现它?我的想法是前端反向代理应该能够将 letsencrypt 发出的请求转发到 Web 服务器以验证客户端,但它似乎不起作用。任何帮助都非常感谢!
答案1
您仍需要在前端 nginx 机器上终止 SSL 请求,方法是在前端机器上安装 sub.domain.com 的证书。就像您在反向代理场景中使用 http 时所做的一样。在这种情况下,唯一的区别是您还需要在后端和前端机器之间建立有效的证书协议。