我並不完全有一個解決方案,但我可以解釋這是什麼原因,你可能需要仔細檢查你的身邊。
因此,總之,這是由於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();