build.shibboleth.net 为某些地区提供了错误的证书

build.shibboleth.net gives wrong certificate for some regions

我们的一个 Jenkins 构建尝试连接到 build.shibboleth.net 失败。所以我做了一些分析。

请查看来自 2 个区域的这些 openssl 结果。

在南亚地区:它给出了test.shibboleth.net的证书,这是错误的。

$ openssl s_client -host build.shibboleth.net -port 443 -prexit -showcerts

CONNECTED(00000005)
depth=1 C = US, ST = Ohio, O = Shibboleth Consortium, CN = Shibboleth Project Intermediate CA
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=US/ST=Ohio/O=Shibboleth Consortium/CN=test.shibboleth.net
   i:/C=US/ST=Ohio/O=Shibboleth Consortium/CN=Shibboleth Project Intermediate CA
...
...

在美国地区:它给出了 shibboleth.net 的证书,这是正确的。

$ openssl s_client -host build.shibboleth.net -port 443 -prexit -showcerts

CONNECTED(00000005)
depth=2 O = Digital Signature Trust Co., CN = DST Root CA X3
verify return:1
depth=1 C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
verify return:1
depth=0 CN = shibboleth.net
verify return:1
---
Certificate chain
 0 s:CN = shibboleth.net
   i:C = US, O = Let's Encrypt, CN = Let's Encrypt Authority X3
...
...

resolveip build.shibboleth.net 从两个地区给出 3.213.250.186

为什么给一个地区的证书是错误的?我不知道如何解决这个问题。有什么想法吗?

我推测上述结果不是由区域依赖引起的,而是您在两台客户端计算机上使用了不同版本的 openssl

我们曾经 运行 不同 IP 地址上的不同虚拟主机。现在,所有内容都使用一个地址,我们依靠 SNI 来区分请求,以便返回正确的证书。

如果 openssl 客户端没有提供服务器名称,那么您可能会得到一个默认证书,而不是您期望的证书。 openssl 是否这样做取决于所使用的 openssl 的版本(openssl version 1.1.1 会,早期版本不会)。

您可以尝试将 -servername build.shibboleth.net 添加到您的 openssl 命令中,看看是否会改变行为。