我正在研究通过websocket连接到服务器的Android客户端实现。我刚刚在服务器实例上启用了HTTPS,现在收到此问题:
W/System.err: com.neovisionaries.ws.client.HostnameUnverifiedException: The certificate of the peer (CN=otherdomain.com) does not match the expected hostname (domain.com)
at com.neovisionaries.ws.client.SocketConnector.verifyHostname(SocketConnector.java:171)
at com.neovisionaries.ws.client.SocketConnector.doConnect(SocketConnector.java:126)
at com.neovisionaries.ws.client.SocketConnector.connect(SocketConnector.java:83)
at com.neovisionaries.ws.client.WebSocket.connect(WebSocket.java:2152)
at com.neovisionaries.ws.client.ConnectThread.runMain(ConnectThread.java:32)
at com.neovisionaries.ws.client.WebSocketThread.run(WebSocketThread.java:45)
似乎websocket客户端找到不匹配的服务器主机名。
其他一些相关信息:
otherdomain.com
是我们的另一个网址。它指向与domain.com
在同一服务器上运行的同一Web应用程序的单独实例,这是我当前正在使用的应用程序。
我的代码正在记录它所连接的URL,并且可以看到它正确引用了domain.com
:
connecting to: wss://domain.com?session_key=TheCorrectSessionKey
如上所述,otherdomain.com
是同一Web应用程序的另一个实例。该实例先前已启用HTTPS,并且该实例一切正常。我现在使用的相同客户端代码能够成功连接到该实例。
同一Web应用程序具有一个前端页面,该页面也通过wss://连接到websocket。据我所知,唯一有问题的客户端是Android客户端,这在domain.com
的Chrome浏览器和Firefox浏览器中均能正常工作,而Android客户端是唯一有问题的客户端,而应用程序的domain.com
变体只有otherdomain.com
似乎工作正常。
我发现this issue在我用于网络套接字的库中打开。但是我不确定100%是否与我的问题有关,但可能与之有关。特别是有人指出:
除非已将其配置为网站上的默认服务器,否则无法连接到已启用WebSocket的服务器域。
我假设只能将一个站点设为默认站点,并且otherdomain.com
可能已设置为默认站点,因为它是首先完成的。老实说,这一切都让我感到头疼,我不确定这是不是真的。