关于wss设置失败的问题


在gateway代码里面设置了如下设置wss的代码

// gateway 进程,这里使用Text协议,可以用telnet测试
$context = array(
// 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php
'ssl' => array(
// 请使用绝对路径
'local_cert' => '/private.crt', // 也可以是crt文件
'local_pk' => '/public.key',
'verify_peer' => false,
// 'allow_self_signed' => true, //如果是自签名证书需要开启此选项
)
);
// websocket协议(端口任意,只要没有被其它程序占用就行)
$gateway = new Gateway("websocket://0.0.0.0:8282", $context);
// 开启SSL,websocket+SSL 即wss
$gateway->transport = 'ssl';

// gateway名称,status方便查看
$gateway->name = 'YourAppGateway';
// gateway进程数
$gateway->count = 4;
// 本机ip,分布式部署时使用内网ip
$gateway->lanIp = '127.0.0.1';
// 内部通讯起始端口,假如$gateway->count=4,起始端口为4000
// 则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
$gateway->startPort = 2900;
// 服务注册地址
$gateway->registerAddress = '127.0.0.1:1236';

$gateway->pingInterval = 12;

$gateway->pingNotResponseLimit = 2;

$gateway->pingData = '';
/*
// 当客户端连接上来时,设置连接的onWebSocketConnect,即在websocket握手时的回调
$gateway->onConnect = function($connection)
{
$connection->onWebSocketConnect = function($connection , $http_header)
{
// 可以在这里判断连接来源是否合法,不合法就关掉连接
// $_SERVER['HTTP_ORIGIN']标识来自哪个站点的页面发起的websocket链接
if($_SERVER['HTTP_ORIGIN'] != 'http://kedou.workerman.net')
{
$connection->close();
}
// onWebSocketConnect 里面$_GET $_SERVER是可用的
// var_dump($_GET, $_SERVER);
};
};
*/

// 如果不是在根目录启动,则运行runAll方法
if(!defined('GLOBAL_START')) {
Worker::runAll();
}



然后使用wss连接会报错,报错的内容如图,PHP端会报错:

Warning: stream_socket_enable_crypto(): Private key does not match certificate! in /data/wwwroot/GatewayWorker/vendor/workerman/workerman/Connection/TcpConnection.php on line 729

Warning: stream_socket_enable_crypto(): SSL_R_NO_SHARED_CIPHER: no suitable shared cipher could be used.


环境:
php7.1
nginx

ssl文件没有问题,提交工单问了一次,路径也没有写错,专门用file_get_contents在代码运行的时候打印出来看过,端口防火墙,安全组也开了,专门检测过...也试过用nginx代理了一次,会出现502错误(nginx代理和php代码只开了一个,没有两个同时设置),调了一天,实在不行才硬着头皮来论坛问。。。希望有大神可以解答一下...

微信图片_20180518175649.png


微信图片_20180518175653.png

已邀请:

mdx2007

赞同来自: sbb

Private key does not match certificate!
看起来是key文件和证书不匹配啊

maq

赞同来自: sbb

private.crt, public.key ...

这就有点奇怪了,一般不应该是 public certificate 和 private key 么?……

maq

赞同来自: sbb

PHP 手册上查到的解释:

local_cert string
本地证书路径。 必须是 PEM 格式,并且包含本地的证书及私钥。 也可以包含证书颁发者证书链。 也可以通过 local_pk 指定包含私钥的独立文件。

local_pk string
如果使用独立的文件来存储证书(local_cert)和私钥, 那么使用此选项来指明私钥文件的路径。

【必须是 PEM 格式】,会不会是这个原因?

sbb - 后端

赞同来自:

很感谢各位的帮助,最后还是使用nginx代理解决了,原因在于自己用了docker,nginx和workerman所在两个不同容器,php代码设置的话还是不行,所以在这里我贴一下nginx设置吧...

server {
listen 80;
server_name domain;

rewrite ^(.*)$ https://domain$1 permanent;
}

server {
listen 443 ssl;
server_name domain;
root /data/wwwroot/domain/public;
error_log /data/wwwlogs/error.log;
add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";

index index.php index.html index.htm;

charset utf-8;
# ssl
ssl on;
ssl_certificate ssl/private.crt;
ssl_certificate_key ssl/public.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;

# 链接使用自己的容器关联名字
location =/wss
{
proxy_pass http://php-fpm:8282;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_connect_timeout 60;
proxy_send_timeout 60;
proxy_read_timeout 3000;
}
# php的设置
location / {
if (!-e $request_filename) {
rewrite ^/(.*)$ /index.php/$1 last;
break;
}
}

location ~ .+\.php($|/) {
set $script $uri;
set $path_info "/";

if ($uri ~ "^(.+\.php)(/.+)") {
set $script $1;
set $path_info $2;
}

fastcgi_pass php-fpm:9000;
fastcgi_index index.php?IF_REWRITE=1;
fastcgi_param PATH_INFO $path_info;
fastcgi_param SCRIPT_FILENAME $document_root/$script;
fastcgi_param SCRIPT_NAME $script;
include fastcgi_params;
}
}

要回复问题请先登录注册