支持。workerman 5.2.3 完全支持自定义协议的 ssl/tls 加密,需满足:✅ workerman ≥ 3.3.7、✅ php 启用 openssl 扩展、✅ 使用无密码 pem 证书;配置时监听地址须为 'ssl://0.0.0.0:8383',ssl_context 必传且含绝对路径证书与 'verify_peer' => false。

支持。Workerman 5.2.3 完全支持自定义协议的 SSL/TLS 加密,前提是满足基础条件并正确配置 SSL 上下文。
必须满足的三个前提
✅ Workerman ≥ 3.3.7(5.2.3 远高于此,没问题)
✅ PHP 已启用 openssl 扩展(运行 php -m | grep openssl 确认)
✅ 拥有合法 PEM 格式证书:含私钥 + 域名证书 + 中间证书(推荐合并为 fullchain.pem),且私钥不能设密码
自定义协议开启 SSL 的关键写法
与 HTTP/WebSocket 类似,自定义协议只需将传输层协议前缀改为 ssl://,并显式传入 ssl_context 数组:
- 监听地址写成 'ssl://0.0.0.0:8383'(不能只写 0.0.0.0:8383)
- ssl_context 必须作为 Worker 构造参数或 $worker->context 属性设置,不可省略
- 证书路径必须是绝对路径(如 /home/www/cert/fullchain.pem),相对路径在守护进程模式下大概率失效
- 务必设置 'verify_peer' => false(Workerman 不做客户端校验,设 true 会导致握手失败)
典型配置示例(自定义二进制协议)
假设你已实现 MyProtocol 类:
$worker = new Worker('ssl://0.0.0.0:8383', [
'ssl_context' => [
'local_cert' => '/absolute/path/to/fullchain.pem',
'local_pk' => '/absolute/path/to/privkey.pem',
'verify_peer' => false,
]
]);
$worker->protocol = MyProtocol::class;
$worker->onMessage = function($connection, $data) {
$connection->send('ACK: ' . strlen($data));
};
Worker::runAll();
常见踩坑点
- 启动无报错但连接被重置 → 检查 ssl_context 是否漏传,或证书路径权限不足(www-data 用户需可读)
- ERR_SSL_PROTOCOL_ERROR → 大概率是 verify_peer 未设 false,或证书文件顺序错误(应为:私钥 → 域名证书 → 中间证书)
- curl 测试通但 Workerman 不行 → curl 不校验服务端上下文,而 Workerman 严格依赖 local_cert 和 local_pk 加载,需用 openssl x509 -in cert.pem -text -noout 验证内容











