https下swoole+websocket+wss无法链接解决方案

在成功利用swoole_websocket_server 开启websocket服务之后,遇到一个问题,大多数web都是https的,特别是涉及到安全性比较高,设计互联网金融、数字货币的时候,https都是必须的。这时候,因为安全问题,ws://连接会被禁止。

简单说明(一)

1. 安装swoole的openssl支持。

重新编译安装swoole源码,加上--enable-openssl

%PHP_BIN%/phpize
cd swoole_src
./configure --enable-openssl
make && make install

2. 代码中使用websocket ssl代替ws

  • 服务端,比较上次代码,做出以下改变即可
//初始化类的时候,加上openssl参数
 $serv = new swoole_websocket_server(":", 8080, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);
 //配置证书文件位置
 $key_dir = "YOUR_KEY_DIR";
 $serv->set(array(
   'work_num'=>1,
   'ssl_cert_file'=>$key_dir.'/file.crt',
   'ssl_key_file' =>$key_dir.'file.key'
  )
 );

web客户端WebSocket 将ws换为wss即可

var wsl = "wss://domain/path";  //将【ws:】换成 【wss:】即可
ws = new WebSocket(wsl);

详细说明(二):

已解决网站安装SSL证书后,Swoole websoket wss报错误:failed: WebSocket opening handshake timed out,最终超时连接不上的问题。

系统架构:LNMPA,Nginx版本:
 # nginx –V

# nginx version: nginx/1.12.1

支持协议升级 https upgrade websocket

域名:www.gznotes.com

证书:已安装阿里云DV SSL证证书,全站https访问。

—–调通要点—–
要点一:javascript中new Websocket使用Websocket协议加密安全版的wss,而不是ws。

javascript中new Websocket使用Websocket协议加密安全版的wss,而不是ws。
图:使用Websocket协议加密安全版的wss

要点二:Swoole编译安装要打开enable-openssl。

默认pecl install swoole中没有配置–eanble-openssl,可查看确认。

Swoole安装版本以及参数配置项查看php  -–ri swoole

Swoole安装版本以及参数配置项查看php –ri swoole
图:Swoole安装版本以及参数配置项查看php –ri swoole

下载源码包自编译安装并配置开启参数

./configure –enable-openssl –enable-swoole –enable-sockets –with-php-config=/usr/local/php/bin/php-config

要点三:Swoole服务端设置,使用SWOOLE_SSL标志,配置证书和私钥。

Swoole服务端设置,使用SWOOLE_SSL标志,配置证书和私钥
图:Swoole服务端用SWOOLE_SSL标志启用加密,配置证书和私钥

Tips:阿里云证书文件包中的证书后缀pem,不需要转换cer crt,直接使用即可。

—–原文参考链接—–

http://blog.csdn.net/guokaikevin/article/details/78946427

https://www.gznotes.com/swoole-websoket-https-ssl-wsstime-out/