在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代码只开了一个,没有两个同时设置),调了一天,实在不行才硬着头皮来论坛问。。。希望有大神可以解答一下...
Private key does not match certificate!
看起来是key文件和证书不匹配啊
问题是我证书设置nginx的https是可以的
nginx 配置方便贴出来么?
@1490:我搞好了,想不到是docker的问题...workerman和nginx是两个容器....所以代理到workerman不应该到127.0.0.1,而是容器关联名字...
@1490:谢谢老哥
private.crt, public.key ...
这就有点奇怪了,一般不应该是 public certificate 和 private key 么?……
你说的也对....可能真是这个问题..谢老哥
PHP 手册上查到的解释:
local_cert string
本地证书路径。 必须是 PEM 格式,并且包含本地的证书及私钥。 也可以包含证书颁发者证书链。 也可以通过 local_pk 指定包含私钥的独立文件。
local_pk string
如果使用独立的文件来存储证书(local_cert)和私钥, 那么使用此选项来指明私钥文件的路径。
【必须是 PEM 格式】,会不会是这个原因?
但是我找了一下服务商,没有pem格式的证书,不知道是不是要自己转换,workerman手册上说可以使用crt格式的证书
很感谢各位的帮助,最后还是使用nginx代理解决了,原因在于自己用了docker,nginx和workerman所在两个不同容器,php代码设置的话还是不行,所以在这里我贴一下nginx设置吧...
我也遇到这个问题 求助啊~~证书是存在的..