我们的一个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地址上运行不同的vhosts。现在,一个地址用于所有的事情,我们依靠的是 SNI 来区分请求,以便返回正确的证书。
如果 openssl
客户端没有提供服务器名称,那么你可能会得到一个默认证书,而不是你所期望的。无论 openssl
是否如此取决于 openssl
使用中的(openssl version
1.1.1有,早期版本没有)。)
您可以尝试添加 -servername build.shibboleth.net
对你的 openssl
命令,看看是否会改变行为。