关于wss设置失败的问题

sbb

在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标识来自哪个站点的页面发起的websocket链接
        if($_SERVER != '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代码只开了一个,没有两个同时设置),调了一天,实在不行才硬着头皮来论坛问。。。希望有大神可以解答一下...

图片

图片

9353 4 0
4个回答

mdx2007

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

  • sbb 2018-05-19

    问题是我证书设置nginx的https是可以的

  • mdx2007 2018-05-19

    nginx 配置方便贴出来么?

  • sbb 2018-05-21

    @1490:我搞好了,想不到是docker的问题...workerman和nginx是两个容器....所以代理到workerman不应该到127.0.0.1,而是容器关联名字...

  • sbb 2018-05-21

    @1490:谢谢老哥

maq

private.crt, public.key ...

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

  • sbb 2018-05-21

    你说的也对....可能真是这个问题..谢老哥

maq

PHP 手册上查到的解释:

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

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

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

  • sbb 2018-05-21

    但是我找了一下服务商,没有pem格式的证书,不知道是不是要自己转换,workerman手册上说可以使用crt格式的证书

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;
    }
}
  • 林枫aaron 2019-10-25

    我也遇到这个问题 求助啊~~证书是存在的..

年代过于久远,无法发表回答
🔝