【问题标题】:Unable to connect to Websocket server over TLS无法通过 TLS 连接到 Websocket 服务器
【发布时间】:2015-10-17 17:35:42
【问题描述】:

我一直在使用 Javascript 前端和 Java 后端测试 Websockets 的功能。我已经设法在使用标准 HTTP/WS 协议的客户端和服务器之间进行通信,但希望启用 HTTPS 来为前端(网站)提供服务,然后使用 WSS 连接到服务器 Java 端点。

到目前为止,我已经使用自签名证书通过 HTTPS/TLS 设置了网站,并且能够使用 HTTPS 协议导航到该网站:“https://domain-name.chat”。

现在我认为在建立新的 Websocket 连接时只需将 uri 中的协议更改为 WSS,因此我将 uri 更改为“wss://domain.name.chat/serverEndpoint”。

现在,当我加载网页时,没有建立连接,因为它触发了 Websocket.onclose() 事件处理程序。

我知道代码没有任何问题,因为它以前使用 HTTP/WS 工作。

我是否理解 Websockets 没有跨域脚本阻塞的问题?

我是否在设置 HTTPS/WSS 的过程中遗漏了一个步骤?

编辑:为网站域添加了虚拟主机信息

<IfModule mod_ssl.c>
<VirtualHost *:443>
    ServerAdmin webmaster@localhost
    ServerName domain-name.chat
    ServerAlias www.domain-name.chatt

    DocumentRoot /usr/local/apache-tomcat-7.0.47/webapps/WebSocketChat/
    RewriteEngine on
    RewriteRule ^/(.*)$ /WebSocketChat/$1 [l,PT]
    JkMount /* worker2

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/apache.crt
    SSLCertificateKeyFile /etc/apache2/ssl/apache.key

</VirtualHost>
</IfModule>

这是 Tomcat7 的 server.xml 中的连接器设置:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="250" scheme="https" secure="true"
               keystoreFile="${user.home}/.keystore" keystorePass="changeit"
               clientAuth="false" sslProtocol="TLS" />

【问题讨论】:

  • 您是否在 websocket 服务器端进行了适当的更改? IE。设置证书,tls?
  • @Andrey 是的,我设置了 ssl 并生成了一个自签名证书,并使用证书和密钥等启用了虚拟主机 SSLEngine。TLS 是否与 SSL 分开?
  • Tls 与 ssl 是分开的,但这与问题无关,因为 https 可以使用这两种协议进行加密。我也看到你在使用 apache,你能提供 websocket 相关的配置,所以我们可以诊断出什么问题吗?可能是this 问题会有帮助吗?
  • 我没有尝试重新配置我的服务器,以专门针对 Websockets,只是为了让 SSL 虚拟主机允许使用 https 访问网站,我认为 wss 可以正常工作。

标签: javascript java ssl https websocket


【解决方案1】:

由于您使用的是自签名证书,即使一切设置正确,浏览器也有可能拒绝连接。

例如,我的 Safari 浏览器不会连接到我的自签名证书服务器 (Iodine),而 Chrome 会。

我认为 Safari 会一直检查证书注册表,而 Chrome 则不会(如果您通过警告屏幕)...这是特定于浏览器的。

Websocket 协议规定,如果证书无效,浏览器应终止连接。

至于:

我是否理解 Websockets 没有跨域脚本阻塞的问题?

这不是那么简单,还有一个次要的安全标头可以防止跨站点脚本。

虽然这一点的安全性很容易绕过,但浏览器会发送标头Origin,其中说明了原始 URL。当您尝试连接到不同 URL 上的 Websocket 时,服务器可能会拒绝该连接,除非它被设置为接受来自任何来源的连接。

编辑:cmets 提出的另一个想法是,您的服务器可能没有正确设置。您是直接连接到明文 websocket 服务器还是使用 apache?对于apache代理Websockets,需要做一些调整(搜索mod_websocket)。

【讨论】:

    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-04
    • 2018-10-21
    • 2017-10-23
    • 2017-11-30
    相关资源
    最近更新 更多