我本地配置的ssl没有问题
<?php
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Timer;
use Workerman\Worker;
require_once("./vendor/autoload.php");
$worker = new Worker();
$worker->count = 1;
$worker->onWorkerStart = function ($worker) {
// 设置访问对方主机的本地ip及端口以及ssl证书
$context_option = array(
'socket' => array(
// ip必须是本机网卡ip,并且能访问对方主机,否则无效
'bindto' => '192.168.0.39',
),
// ssl选项,参考https://php.net/manual/zh/context.ssl.php
'ssl' => array(
// 本地证书路径。 必须是 PEM 格式,并且包含本地的证书及私钥。
'local_cert' => './mkcert+4.pem',
// local_cert 文件的密码。
'passphrase' => './mkcert+4-key.pem',
// 是否允许自签名证书。
'allow_self_signed' => true,
// 是否需要验证 SSL 证书。
'verify_peer' => false
)
);
$con = new AsyncTcpConnection('ws://socket.idcd.com:1443', $context_option);
$con->onConnect = function (AsyncTcpConnection $con) {
// //定时给服务端推送数据
Timer::add(2, function () use ($con) {
$time = date("Y-m-d H:i:s ");
$con->send('my time is ' . $time);
});
};
// 设置以ssl加密方式访问
$con->transport = 'ssl';
$con->onMessage = function (AsyncTcpConnection $con, $data) {
echo($data . "------hello----" . PHP_EOL);
};
$con->onClose = function (AsyncTcpConnection $con) {
// 如果连接断开,则在1秒后重连
$con->reConnect(1);
};
$con->onError = function ($con, $code, $msg) {
echo "Error code:$code msg:$msg\n";
};
$con->connect();
};
Worker::runAll();
但是运行上面的代码,workman会提示 SSL handshake error: stream_socket_enable_crypto(): Unable to set private key file 我也发现了,有好几个遇到我类似的问题,但是没有解答
搞不懂,这个有啥疑问么?
ws://echo.websocket.org:443 改成 ws://socket.idcd.com:1443 呗
服务器那边用的是wss 就是wss://socket.idcd.com:1443
但是 我改成 wss://socket.idcd.com:1443 就直接报错了。class \Protocols\Wss not exist
ws://socket.idcd.com:1443 啊,不是 wss://socket.idcd.com:1443
服务器上强制要用wss 你把wss直接改为ws是行不通的!
你可能手册没看全。他是 ws + ssl 就是wss了
https://www.workerman.net/doc/workerman/faq/as-wss-client.html
ssl标准的是443,但是这个wss地址他把端口给改了呢,总不能加两个端口号吧
方便不,要不麻烦帮忙写一个实例呗。测试url是:https://www.idcd.com/tool/socket 这里面有测试wss的地址呢
看服务端端口号是多少啊,是多少写多少呗。是标准的443就写443呗
https://www.workerman.net/doc/workerman/faq/as-wss-client.html
直接用手册里的例子2,改下域名就行了啊,搞不懂为什么简单的事情搞不定
客户端不用设置什么证书。除非服务端有特别的需要。
好的,谢谢! 按照你说的,搞定了,不需要配置客户端