Nginx 到 Tomcat SSL 代理

Nginx 到 Tomcat SSL 代理

我已经为客户端身份验证配置了一个带有 SSL 的 tomcat 应用程序。它位于端口 8443 上。它运行良好,因此当我尝试使用客户端证书 (client.p12) 访问 tomcat 时,我成功了,而使用不在密钥库中的另一个证书时,会出现错误的 SSL 错误。所以这有效。

然后我尝试将 nginx 放在 tomcat 前面作为代理,但总是出现 502。Nginx 也使用 SSL。以下是我收到的错误。

2018/04/20 17:25:03 [error] 21884#0: *3 SSL_do_handshake() failed (SSL: error:14094412:SSL routines:SSL3_READ_BYTES:sslv3 alert bad certificate:SSL alert number 42) while SSL handshaking to upstream, client: 10.6.8.20, server: 10.6.3.105, request: "GET /print HTTP/1.1", upstream: "https://10.6.3.105:8443/", host: "10.6.3.105"

有人能帮我解决这个问题吗?最终,我只想通过同样使用 SSL 的 nginx 传递 tomcat 证书。(Nginx(https) -> Tomcat(https))。

我知道这是一个奇怪的要求,但我需要这个。

谢谢,

答案1

从您的评论来看,您似乎正在使用客户端证书进行身份验证。如果是这样,您不能使用 Nginx 的 HTTP 代理,而必须使用 Stream 代理。查看此处的帖子了解更多详细信息:

如何在不解密的情况下路由 HTTPS 加密数据包?

在处理客户端证书时,客户端证书在 TLS 握手过程中实际上被“使用”,因此如果 Nginx 首先接受 SSL 连接,客户端将向 Nginx 出示证书进行验证。由于您的 tomcat 应用程序需要处理客户端证书进行身份验证,因此代理连接没有可用的证书;这将导致 TLS 握手失败。

使用 Nginx Stream 模块可以让您不间断地将流量(从而保留客户端证书)发送到 tomcat 进程,并允许从客户端证书进行正确的身份验证。

听起来您只有一个进程可以使用,因此您不需要 SSL 预读模块(除非需要负载平衡),您可能只需要以下内容:

stream {
    server {
        listen 443;
        listen [::]:443;

        proxy_pass 127.0.0.1:8443;
    }
}

相关内容