【问题标题】:Wss Webserver not working properly with self signed keyWss Webserver 无法使用自签名密钥正常工作
【发布时间】:2019-12-24 03:20:32
【问题描述】:

我使用 php React 和 Ratchet 创建了一个 PHP 安全 websocket (wss) 服务器。我只有一个自签名证书,因为我目前只尝试将我的服务器用作应用程序的后端,所以我不需要域名,因为它仅供应用程序访问,而不是供人们访问直接,因此为此必须订阅域名似乎是浪费金钱,而且在获得受信任的 ssl 证书之前我需要一个域名,并且无论如何我都拥有服务器。话虽这么说,这是我在

中的代码

安全套接字服务器.php:

<?php

use React\Socket\SecureServer;

require dirname(__DIR__) . '/vendor/autoload.php';
require 'Pool.php';

$loop = React\EventLoop\Factory::create();
$webSock = new React\Socket\Server('0.0.0.0:<my_port>', $loop);
$webSock = new React\Socket\SecureServer($webSock, $loop, [
    'local_cert'        => '<my_ssl_cert_path>.pem',
    'local_pk'          => '<my_ssl_cert_key>.key',
    'allow_self_signed' => TRUE,
    'verify_peer' => TRUE,
    'allow_self_signed' => TRUE
]);

$webServer = new Ratchet\Server\IoServer(
    new Ratchet\Http\HttpServer(
        new Ratchet\WebSocket\WsServer(
            new Pool()
        )
    ),
    $webSock,
    $loop
);

$webServer->run();

我跑

php secure-web-socket.php

我尝试从 Android 连接到它,但出现“握手失败”

还有,当我跑的时候

./testssl.sh <my_host_ip>:<my_port>

我明白了:

<my_host_ip>:<my_port> doesn't seem to be a TLS/SSL enabled server

如果我使用:

 ./testssl.sh <my_host_ip>:443

我实际上得到的结果表明它是一个启用 TLS/SSL 的服务器。

在我的 nginx 文件中,我有:

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        listen 443 ssl default_server;
        listen [::]:443 ssl default_server;

        include snippets/<my_certificate_config_file>.conf;

        root /usr/share/nginx/html;

        # Add index.php to the list if you are using PHP
        index index.php index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ =404;
        }

        # pass PHP scripts to FastCGI server
        #
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;

                fastcgi_pass unix:/var/run/php5-fpm.sock;
        }
}

我确实尝试将其添加到我的 nginx 文件中:

server {
    listen <my_port> ssl;
    listen [::]:<my_port> ssl;
    server_name <my_host_ip>;

    # Add index.php to the list if you are using PHP
    #index index.html index.htm index.nginx-debian.html;
    include snippets/<my_certificate_config_file>.conf

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
}

并重新启动了 nginx,但这导致我在https://my_host_ip/ 下的网页无法连接。而且,加上那个解决方案,即使它有效,也只能让我在一个端口上安全地运行我的套接字服务器,而不是任何可用的端口。

我如何让它工作?

更新:

我已经通过了这些问题,但现在正在处理 android 获得“预期 101,收到:500”

【问题讨论】:

  • 也许我错过了什么。但是您是否必须添加标头升级指令才能使用 Websocket 协议?如上所述:nginx.org/en/docs/http/websocket.html
  • @Dean,我通过了这些错误,但现在连接后在 android 端得到“预期 101,收到:500”
  • @Dean,其实我现在已经完全解决了!

标签: php ssl nginx wss


【解决方案1】:

所以,我设法让这一切正常工作。首先,对于握手失败的部分,我可能有错误的路径:

 'local_cert'        => '<my_ssl_cert_path>.pem',
 'local_pk'          => '<my_ssl_cert_key>.key',

因为我创建了一个新的证书和密钥并使用了它们,并且我在 Android 客户端使用的 tech.gusavila92.websocketclient.WebSocketClient` 类中通过了“握手失败”错误。

在那之后,我在 WebSocket 类中出现了“预期 101,得到 500”错误。我做了一些挖掘,发现这是因为我不能使用new WebSocketClient("wss://ip-address:port");,但我必须使用new WebSocketClient("wss://ip-address:port/");,注意额外的斜线。

这就是原因。所以很明显,标题的第一行是使用“GET raw_url 1.1”构建的,如果你没有斜杠,你会得到“GET HTTP/1.1”,但是 PHP Guzzle 想要看到“GET / HTTP/1.1”,而不是“ GET HTTP/1.1",否则在解析标头时会引发异常。在这种情况下,raw_url 是 :port 之后的所有内容,所以如果你没有放“/”,你会得到一个空白的 raw_url,所以你会得到“GET HTTP/1.1”,但是如果你在后面加上一个斜杠,你会得到“GET / HTTP/1.1"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 2014-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多