我一直在使用Javascript前端和Java后端测试Websockets的功能。我已经设法在客户端和服务器之间进行标准HTTP / WS协议之间的通信,但是希望启用HTTPS来提供前端(网站),然后使用WSS连接到服务器Java端点。
到目前为止,我已使用自签名证书使用HTTPS / TLS设置网站,并且我可以使用HTTPS
协议导航到该网站:" https://domain-name.chat&# 34。
现在我认为只是在建立新的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" />
答案 0 :(得分:0)
由于您使用的是自签名证书,因此即使正确设置了所有内容,浏览器仍有可能拒绝连接。
例如,我的Safari浏览器将无法连接到我的自签名证书服务器(碘)。
我认为Safari会一直检查证书注册表而Chrome不会(如果您通过警告屏幕)...这是浏览器特定的。
Websocket协议规定,如果证书无效,浏览器应终止连接。
至于:
我是否理解Websockets没有跨域脚本阻塞问题?
这不是那么简单,并且有一个小的安全标头可以防止跨站点脚本。
虽然这一点上的安全性很容易规避,但浏览器会发送标题Origin
来表明原始URL。当您尝试连接到不同URL上的Websocket时,服务器可能会拒绝该连接,除非它被设置为接受来自任何源的连接。
修改:评论带来的另一个想法是您的服务器可能未正确设置。您是直接连接到明文websocket服务器还是使用apache?对于代理Websockets的apache,需要进行一些调整(搜索mod_websocket)。