2017-07-25 55 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(); 
相关问题