Wss Web 服务器无法使用自签名密钥正常工作
Wss Webserver not working properly with self signed key
我使用 php React 和 Ratchet 创建了一个 PHP 安全的 websocket (wss) 服务器。我只有一个自签名证书,因为我目前只是尝试将我的服务器用作应用程序的后端,所以我不需要域名,因为它仅供应用程序访问,而不供人们访问直接,因此为此订阅域名似乎是浪费金钱,而且在获得受信任的 ssl 证书之前我需要一个域名,而且无论如何我都拥有服务器。话虽如此,这是我在
中的代码
安全套接字-server.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 连接到它,我得到了 "handshake failed"
还有,当我运行
./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 得到 "Expected 101, received: 500"
所以,我设法让它全部工作。首先,至于握手失败的部分,我可能有错误的路径:
'local_cert' => '<my_ssl_cert_path>.pem',
'local_pk' => '<my_ssl_cert_key>.key',
因为我制作了一个新的证书和密钥并使用了它们,我在 android 上使用的 tech.gusavila92.websocketclient.WebSocketClient` class 中通过了 "handshake failed" 错误=]客户端。
在那之后,我在 WebSocket class 中遇到了错误 "Expected 101, got 500" 错误。我做了一些挖掘,发现这是因为我不能使用 new WebSocketClient("wss://ip-address:port");
,但我必须使用 new WebSocketClient("wss://ip-address:port/");
,注意额外的斜杠。
原因如下。所以显然 header 的第一行是使用 "GET raw_url 1.1" 构建的,如果你没有斜杠,你会得到 "GET HTTP/1.1",但是 PHP Guzzle 想要请参阅 "GET / HTTP/1.1",而不是 "GET HTTP/1.1",否则它会在解析 header 时抛出异常。在这种情况下,raw_url 是 :port 之后的所有内容,所以如果你不输入“/”,你会得到一个空白 raw_url,所以你会得到 "GET HTTP/1.1",但是如果你输入斜线之后,你得到 "GET / HTTP/1.1"
我使用 php React 和 Ratchet 创建了一个 PHP 安全的 websocket (wss) 服务器。我只有一个自签名证书,因为我目前只是尝试将我的服务器用作应用程序的后端,所以我不需要域名,因为它仅供应用程序访问,而不供人们访问直接,因此为此订阅域名似乎是浪费金钱,而且在获得受信任的 ssl 证书之前我需要一个域名,而且无论如何我都拥有服务器。话虽如此,这是我在
中的代码安全套接字-server.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 连接到它,我得到了 "handshake failed"
还有,当我运行
./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 得到 "Expected 101, received: 500"
所以,我设法让它全部工作。首先,至于握手失败的部分,我可能有错误的路径:
'local_cert' => '<my_ssl_cert_path>.pem',
'local_pk' => '<my_ssl_cert_key>.key',
因为我制作了一个新的证书和密钥并使用了它们,我在 android 上使用的 tech.gusavila92.websocketclient.WebSocketClient` class 中通过了 "handshake failed" 错误=]客户端。
在那之后,我在 WebSocket class 中遇到了错误 "Expected 101, got 500" 错误。我做了一些挖掘,发现这是因为我不能使用 new WebSocketClient("wss://ip-address:port");
,但我必须使用 new WebSocketClient("wss://ip-address:port/");
,注意额外的斜杠。
原因如下。所以显然 header 的第一行是使用 "GET raw_url 1.1" 构建的,如果你没有斜杠,你会得到 "GET HTTP/1.1",但是 PHP Guzzle 想要请参阅 "GET / HTTP/1.1",而不是 "GET HTTP/1.1",否则它会在解析 header 时抛出异常。在这种情况下,raw_url 是 :port 之后的所有内容,所以如果你不输入“/”,你会得到一个空白 raw_url,所以你会得到 "GET HTTP/1.1",但是如果你输入斜线之后,你得到 "GET / HTTP/1.1"