Javascript 无法通过TLS连接到Websocket服务器

Javascript 无法通过TLS连接到Websocket服务器,javascript,java,ssl,https,websocket,Javascript,Java,Ssl,Https,Websocket,我一直在使用Javascript前端和Java后端测试WebSocket的功能。我已经设法在使用标准HTTP/WS协议的客户机和服务器之间进行通信,但希望启用HTTPS来为前端网站提供服务,然后使用WSS连接到服务器Java端点 到目前为止,我已经使用自签名证书使用HTTPS/TLS设置了该网站,并且我能够使用HTTPS协议导航到该网站: 现在,我假设在建立新的Websocket连接时,只是将uri中的协议更改为WSS,所以我将uri更改为wss://domain.name.chat/serve

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

到目前为止,我已经使用自签名证书使用HTTPS/TLS设置了该网站,并且我能够使用HTTPS协议导航到该网站:

现在,我假设在建立新的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" />

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

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

我认为Safari会一直检查证书注册,而Chrome不会,如果你通过了警告屏幕。。。它是特定于浏览器的

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

至于:

Websockets不存在跨域脚本阻止的问题,我的理解正确吗

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

尽管这一点上的安全性很容易规避,但浏览器会发送声明原始URL的标题来源。当您尝试连接到其他URL上的Websocket时,服务器可能会拒绝该连接,除非将其设置为接受来自任何来源的连接


编辑:评论带来的另一个想法是,您的服务器可能没有正确设置。您是直接连接到明文websocket服务器还是使用apache连接到明文websocket服务器?对于apache代理websocket,需要对搜索进行一些调整。

您在websocket服务器端做了适当的更改吗?例如,设置证书、tls?@Andrey Yes我设置ssl并生成自签名证书,并使用证书和密钥等启用虚拟主机SSLEngine。tls是否与ssl分开?tls与ssl分开,但与问题无关,因为https可以使用这两种协议进行加密。正如我所看到的,您正在使用apache,您是否可以提供websocket相关的配置,以便我们能够诊断出问题所在?这个问题可能会有帮助吗?我并没有尝试以特定于WebSocket的方式重新配置我的服务器,只是为了SSL虚拟主机允许使用https访问网站,我认为wss可以正常工作。