workerman 异步访问外部wss端口,并设置本地ssl证书

json_decode

我本地配置的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 我也发现了,有好几个遇到我类似的问题,但是没有解答

麻烦大佬们,能写一个实例不?连接到 wss://socket.idcd.com:1443 这个地址

阅读 138
1个回答

latin

搞不懂,这个有啥疑问么?
ws://echo.websocket.org:443 改成 ws://socket.idcd.com:1443 呗