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的主要内容,如果未能解决你的问题,请参考以下文章

如何远程或在服务器上运行 Ratchet?

使用 AWS 负载均衡器的安全 Web 套接字 (wss)

如何为本地托管的 wss:// 服务器创建自签名证书

React/ZMQ/Ratchet - Websocket 服务器响应

在 Debian 上运行的 Ratchet PHP Websocket

在 PHP 上使用 Ratchet 和 WebSockets 进行私人和群聊