如何使用安全的 websockets (wss)?
How to use secure websockets (wss)?
我在我的网站上使用 AutobahnJS 和 Thruway,使用非加密连接一切正常:
var connection = new autobahn.Connection({
url: 'ws://www.example.com:9090',
realm: 'restricted_realm'
});
connection.onopen = function (session) {
alert('yay');
};
connection.open();
但是,我无法使用安全连接。将 ws://www.mysite.com:9090
更改为 wss://www.example.com:9090
会导致控制台出现此错误:
WebSocket connection to 'wss://www.example.com:9090/' failed: Error in connection establishment: net::ERR_TIMED_OUT
我的服务器上有 SSL 证书,可以通过 https://www.example.com
访问我的网站。
我需要做什么才能使安全的 websocket 正常工作?
Thruway uses Ratchet 作为 WebSockets 的底层传输,因此您可以参考他们关于部署的文档:
您也可以使用 stunnel 或 nginx。
我用HAProxy 1.5+ for SSL termination。这是我的生产配置的一部分。
frontend public
# HTTP
bind :80
# Redirect all HTTP traffic to HTTPS
redirect scheme https if !{ ssl_fc }
# HTTPS
bind :443 ssl crt ssl.pem no-sslv3 ecdhe prime256v1 ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
acl is_websocket hdr(Upgrade) -i WebSocket
use_backend ws if is_websocket #is_websocket_server
default_backend www
backend ws
server ws1 127.0.0.1:9090
backend www
timeout server 30s
server www1 127.0.0.1:8080
在我的配置中,Apache 在端口 8080 上监听 未加密 流量,WebSocket 服务器监听 未加密[=20] =] 端口 9090
上的流量
我在我的网站上使用 AutobahnJS 和 Thruway,使用非加密连接一切正常:
var connection = new autobahn.Connection({
url: 'ws://www.example.com:9090',
realm: 'restricted_realm'
});
connection.onopen = function (session) {
alert('yay');
};
connection.open();
但是,我无法使用安全连接。将 ws://www.mysite.com:9090
更改为 wss://www.example.com:9090
会导致控制台出现此错误:
WebSocket connection to 'wss://www.example.com:9090/' failed: Error in connection establishment: net::ERR_TIMED_OUT
我的服务器上有 SSL 证书,可以通过 https://www.example.com
访问我的网站。
我需要做什么才能使安全的 websocket 正常工作?
Thruway uses Ratchet 作为 WebSockets 的底层传输,因此您可以参考他们关于部署的文档:
您也可以使用 stunnel 或 nginx。
我用HAProxy 1.5+ for SSL termination。这是我的生产配置的一部分。
frontend public
# HTTP
bind :80
# Redirect all HTTP traffic to HTTPS
redirect scheme https if !{ ssl_fc }
# HTTPS
bind :443 ssl crt ssl.pem no-sslv3 ecdhe prime256v1 ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
acl is_websocket hdr(Upgrade) -i WebSocket
use_backend ws if is_websocket #is_websocket_server
default_backend www
backend ws
server ws1 127.0.0.1:9090
backend www
timeout server 30s
server www1 127.0.0.1:8080
在我的配置中,Apache 在端口 8080 上监听 未加密 流量,WebSocket 服务器监听 未加密[=20] =] 端口 9090
上的流量