javascript - Stilts.js无法通过安全true连接到Websocket服务器

原文 标签 javascript security ssl stomp torquebox

将安全选项设置为true时,我在预订Websocket服务器时遇到问题。我运行了一个SSL验证程序,以确保它已正确设置并且一切都通过了。为了安全起见,我还与托管服务提供商进行了核对,所以我认为这不是问题。而且,将安全性设置为false时,一切都会正常工作。

WSS在端口8676上运行,并且我确保该端口已打开。

我正在使用Stomp Javascript库。我从他们的github master分支(https://github.com/projectodd/stilts/blob/master/stomp-client-js/src/main/javascript/stomp.js)下载了最新版本。

我一直在_transmit()函数内收到此错误:can't call transmit on undefined

似乎未在_transport函数内设置_buildConnector()属性。我添加了一些console.logs,它始终转到此函数中的else语句。

有任何解决办法吗?还是我只是想念一些东西?

这是初始化连接的方式:

client = new Stomp.Client('my.ip.address', 8676, true);

这是我记录某些功能的地方:

Stomp.Client = function(host, port, secure) { console.log('host param: ' + host); console.log('port param: ' + port); console.log('secure param: ' + secure); this._host = host || Stomp.DEFAULT_HOST; this._port = port || Stomp.DEFAULT_PORT || 8675; this._secure = secure || Stomp.DEFAULT_SECURE_FLAG || false; console.log('this._host: ' + this._host); console.log('this._port: ' + this._port); console.log('this._secure: ' + this._secure); }

输出:

host param: my.ip.address port param: 8676 secure param: true this._host: my.ip.address this._port: 8676 this._secure: true

_buildConnector: function(transports, i) { console.log('INSIDE _buildConnector()'); var callback = this._connectCallback; var client = this; if ( i < transports.length ) { console.log('IF!!!'); return function() { var fallback = client._buildConnector( transports, i+1, callback ); try { console.log('_buildConnector::IF::TRY'); transports[i].connect( function() { client._transport = transports[i]; callback(); }, fallback ); } catch (err) { console.log('_buildConnector::IF::CATCH'); fallback(); } }; } else { console.log('_buildConnector::ELSE'); return client.connectionFailed.bind(this); } }

输出:

INSIDE _buildConnector() IF!!! INSIDE _buildConnector() IF!!! _buildConnector::IF::TRY INSIDE _buildConnector() _buildConnector::ELSE _buildConnector::IF::TRY

connectionFailed: function() { console.log('INSIDE connectionFailed()'); if (this._errorCallback) { console.log('connectionFailed::IF'); console.log('this._errorCallback'); console.log(this._errorCallback); console.log('arguments'); console.log(arguments); this._errorCallback.apply(this._errorCallback, arguments); } else { console.log('connectionFailed::ELSE'); console.log('unable to connect :('); Stomp.logger.log( "unable to connect" ); } }

输出:
No output..

最佳答案

我发现了这个名为wscat的node.js工具,该工具可用于将消息发送到Websocket服务器(http://einaros.github.io/ws/)。

使用外部地址输入命令时:
wscat -c wss://my.ip.address:8676

我不断收到以下错误:error: Error: Hostname/IP doesn't match certificate's altnames

但是,当我将其更改为我的域名时:
wscat -c wss://mydomain.com:8676

收到此消息:connected (press CTRL+C to quit)

这导致我:

我将Javascript中的主机值设置为STOMP所在服务器的外部ip地址。但是SSL证书是为域名配置的。这使我认为,对于mydomain.com中的主机参数,应使用my.ip.address而不是new Stomp.Client。但这会在Torquebox日志文件中导致以下错误:

NoSuchHostException: No such host: mydomain.com

因此,在torquebox.yml文件中,主机属性也需要配置为mydomain.com

因此结论是:尝试连接到Websocket服务器时,您需要使用注册到SSL证书的域名,而不是外部IP地址。头晕!

致谢:@bobmcwhirter,他在这里帮助我找到了此解决方案:https://github.com/projectodd/stilts/issues/20

相关文章:

javascript - Javascript使用document.write编写innerHtml的值

javascript - 试图找出一种调整背景图像大小并包含具有窗口宽度比例的元素的方法

javascript - POST未收到正确的响应

c# - 用于上传数据的Web服务:安全注意事项

go - 带有Kafka-Go和证书的Golang TLS。没有关联

javascript - 是否有更合适的方法从SQL进行过滤?

python - pytr-markdown对不受信任的输入安全吗?

php - 基于Symfony 2的项目的安全性和登录

python - SSL和WSGI应用-Python

python-3.x - Python SSL套接字错误:ssl.SSLWantReadError:操作未完成(读取)