iis8 上 WSS 上的 Ratchet Websockets
Posted
技术标签:
【中文标题】iis8 上 WSS 上的 Ratchet Websockets【英文标题】:Ratchet Websockets over WSS on iis8 【发布时间】:2020-11-20 14:45:07 【问题描述】:花了很多时间寻找答案,但似乎没有明确的答案。 我在 IIS8 上设置并运行了棘轮 websockets,这在 ws:// 本地和远程都可以正常工作。我现在想实现 wss:// 但我无法让它工作。
我尝试了两种不同的方法,首先启用 wss on react 如下:
$loop = React\EventLoop\Factory::create();
$webSock = new React\Socket\Server('0.0.0.0:2000', $loop);
$webSock = new React\Socket\SecureServer($webSock, $loop, [
'local_cert' => 'C:/ssl/cert.crt', // path to your cert
'local_pk' => 'C:/ssl/cert_d.key', //path to your server private key
'allow_self_signed' => FALSE, // Allow self signed certs (should be false in production)
'verify_peer' => FALSE
]);
$webServer = new Ratchet\Server\ioserver(
new Ratchet\Http\HttpServer(
new Ratchet\WebSocket\WsServer(
new Chat()
)
),
$webSock, $loop
);
$webServer->run();
当我尝试从客户端连接时,使用它会使 php_cli 崩溃。
我的第二种方法是使用 IIS 重写,并将以下内容添加到 web.config
<rule name="WebSocketTestRule" enabled="true" stopProcessing="true">
<match url=".*" />
<conditions>
<add input="CACHE_URL" pattern="^wss://" />
</conditions>
<action type="Rewrite" url="ws://localhost:2000/" />
</rule>
据我了解,这应该将 wss:// 地址中的所有内容重写为 ws://localhost:2000/。我在 IIS 上安装了 WebSockets。
但这只是给了我以下错误WebSocket connection to 'wss://[domain.name]/' failed: HTTP Authentication failed; no valid credentials available
。
在 IIS 8 上实现 WSS:// 的最佳方式是什么。甚至可能吗? 如何调试这些问题?例如,我如何测试证书是否正常? 如果有人可以帮助我指出正确的方向,并希望这个问题将来可以帮助其他人。
【问题讨论】:
你在iis上使用什么认证方式? Windows 身份验证,还是其他身份验证方法? 我选择了 Windows 身份验证,因此更改为匿名身份验证和匿名用户身份到应用程序池。对重写规则进行了一些更改,所有这些都已启动并正在运行。不确定这有多安全? 【参考方案1】:好的,所以我坚持重写并让它工作。这就是我所做的。
-
确保在 IIS 服务器上将 Websockets 安装为 Windows 功能。
创建一个新的网站文件夹(例如 wssproxy)
确保对该文件夹的访问权限正确。这是我绊倒的地方。我将此文件夹的身份验证方法更改为“匿名身份验证”,并将匿名用户身份指定为“应用程序池身份”
只为创建的文件夹添加重写规则(我的本地服务器端口是 2000)
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="Rewrite ssl to non-ssl" enabled="true" stopProcessing="true">
<match url="(.*)" />
<action type="Rewrite" url="MapProtocol:C:1://127.0.0.1:2000/" />
<conditions>
<add input="CACHE_URL" pattern="^(.+)://" />
</conditions>
</rule>
</rules>
<rewriteMaps>
<rewriteMap name="MapProtocol">
<add key="wss" value="ws" />
<add key="https" value="http" />
</rewriteMap>
</rewriteMaps>
</rewrite>
</system.webServer>
</configuration>
-
在客户端(在我的例子中是 JS)上,包括结尾的“/”
var conn = new WebSocket('wss://domain.com/wssproxy/');
-
不太确定它的安全性,所以我在棘轮服务器中添加了“Origin Check”。
$allowed_origins = array('localhost');
$ws = new WsServer(new Chat());
$checkOrigin = new OriginCheck($ws, $allowed_origins);
$checkOrigin->allowedOrigins[] = 'domain.com';
$server = IoServer::factory( new HttpServer($checkOrigin), 2000 );
$server->run();
之后一切正常。如果有人能指出此配置有任何明显的安全问题,那将很有帮助。
【讨论】:
以上是关于iis8 上 WSS 上的 Ratchet Websockets的主要内容,如果未能解决你的问题,请参考以下文章
React/ZMQ/Ratchet - Websocket 服务器响应