我并不完全有一个解决方案,但我可以解释这是什么原因,你可能需要仔细检查你的身边。
因此,总之,这是由于SNI(服务器名称指示)以及客户端无法支持SNI而发生的。
检查这个答案对于一些洞察到这一问题https://serverfault.com/questions/594368/openssl-returns-different-ssl-certificate-to-that-shown-by-chrome
在这种情况下,同一个IP承载一束域和证书。大多数现代浏览器都支持SNI,并且能够检测到这一点并向您显示正确的证书(尝试使用Firefox)。
但是,当服务器的SSL客户端试图进行握手(而不指定“服务器名称”/“主机名”)时,它不知道要提取哪个证书,并因此提取核心证书。
解决方案? 客户端应该'表明'这是主机名,然后它会获取正确的证书。
实施例: 的OpenSSL的s_client.First -connect dev.botframework.com:443
VS
的OpenSSL的s_client.First -servername dev.botframework.com -connect dev.botframework.com:443
如何解决这个问题?
跳过主机名验证阶段。 Disabling SSL Certificate Validation in Spring RestTemplate或又如:
Registry<ConnectionSocketFactory> registry = RegistryBuilder. <ConnectionSocketFactory>create()
.register("http", PlainConnectionSocketFactory.getSocketFactory()).register("https", new SSLConnectionSocketFactory(SSLContexts.createDefault(), new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
})).build();