来自 EKS 集群 nginx SSL 终结器的错误证书

Wrong certificate from EKS cluster nginx SSL terminator

我有一个奇怪的问题w.r.t 到 spring 引导应用程序(使用 WSS 端点 运行)的安全 websoket 连接。基本上我有一个 websoket 客户端,它是我的生产代码的一部分,它应该使用 let's encrypt 证书连接到 EKS 集群中可用的 wss 端点。但是由于某种原因它没有连接并抛出一个异常 "not a valid certificate path"。我确信我在双方都使用了正确的证书。

经过一些调查,我发现 EKS 在握手期间给了我一个 Kubernetes 假证书,而不是出于某种原因让我们加密证书。有趣的是,如果我在生产代码之外编写一个简单的 websoket 客户端,我就可以使用 let's encrypt 证书连接到端点。

仅供参考,我 运行 这两个代码都来自我的笔记本电脑,因此 JVM 环境、证书存储是相同的。有没有人以前遇到过这个问题,或者你能帮我解决我应该开始调查的领域吗?

通过 wireshirk 捕获,我看到生产请求和我的示例应用程序请求存在以下差异,生产应用程序中缺少 server_name,不知道为什么。

这个问题基本上出现在Java 8。在某些特定的场景下会出现这种情况。基本上,如果 websocket 端点有一个 IP 和多个主机名,那么 host_name 扩展头(SNI)将从客户端提供,如果没有发生,那么你可能会遇到诸如获取错误证书的问题。

参见:http://javabreaks.blogspot.com/2015/12/java-ssl-handshake-with-server-name.html?_sm_au_=iVVZj77NHqPn150Q

我已经使用这个 link 解决了这个问题。基本上我必须使用来自 link.

的 websocket 客户端并提供套接字工厂包装器