2017-07-25 52 views
0

我正在使用Bot連接器REST API,並且在Kik頻道遇到問題。當我嘗試回覆短信,我收到此錯誤:SSL異常<kik.botframework.com>

javax.net.ssl.SSLException: hostname in certificate didn't match: <kik.botframework.com> != <*.azurewebsites.net> OR <*.azurewebsites.net> OR <*.scm.azurewebsites.net> OR <*.azure-mobile.net> OR <*.scm.azure-mobile.net> 

我使用的服務URL是「https://kik.botframework.com」。

我正在運行此關閉本地服務器此刻。在這個配置中,我沒有遇到任何連接Skype頻道的麻煩,但Kik給我帶來了麻煩。

回答

0

的問題最終是正在使用我的服務器HttpClient庫的版本是相當老(4.2.5)和不支持服務器名稱指示。我能夠修補它以支持SNI,如下所示:Server Name Indication (SNI) Support。感謝Arka指出可能出現的問題。

0

我並不完全有一個解決方案,但我可以解釋這是什麼原因,你可能需要仔細檢查你的身邊。

因此,總之,這是由於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(); 
相關問題