我一直在使用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>
这是server.xml中为Tomcat7设置的连接器:
<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没有跨域脚本阻塞的问题是正确的吗?
这不是那么简单,有一个小的安全头,防止跨站脚本。
虽然在这一点上的安全是很容易绕过的,浏览器发送标题Origin
,其中声明了原始的URL。当你试图连接到另一个URL上的Websocket时,服务器可能会拒绝这个连接,除非它被设置为接受来自任何来源的连接。
Edit:由评论引起的另一个想法是,您的服务器可能没有正确设置。您是直接连接到明文websocket服务器还是使用apache?对于apache代理websocket,需要做一些调整(搜索mod_websocket)。