HTTPS站点使用WebSocket的常见错误及解决方案

因为HTTPS是基于SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密,所以在HTTPS站点调用某些非SSL验证的资源时浏览器可能会阻止。比如使用ws://***调用websocket服务器或者引入类似http://***.js的js文件等都会报错。这里简述一下连接websocket服务器时的错误及解决方案。当使用ws://连接websocket服务器时会出现类似如下错误:

Mixed Content: The page at '*****' was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint 'ws://*****'. This request has been blocked; this endpoint must be available over WSS.
(anonymous) 
Uncaught DOMException: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.

如果浏览器不阻止,那在https站点下调用ssl资源才可以,面说一下解决方案:

方案一:假设HTTPS站点使用Nginx服务器,其他服务器也是类似的思路,可以用服务器代理ws服务,可以用nginx的WebSocket proxying,简述一下配置方案

#首先将客户端请求websocket时的地址更改为wss://代理服务器url(代理服务器必须支持https) 例如
var ws = new WebSocket("wss://www.liminghulian.com/websocket");
#在代理服务器上的nginx配置文件中的server中增加如下配置项
location /websocket/ {
    proxy_pass http://backend;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

#http中增加
upstream backend{
   server websocket服务器的ip:端口;
}

这样客户端请求的是wss://服务器,通过nginx的WebSocket proxying代理到实际不支持ssl的websocket服务器。

方案二:直接为WebSocket服务器增加ssl证书,这样就可以直接通过wss://来请求服务器了,以swoole为例,其他服务器也是类似的思路,下面给出示例代码

//使用SSL必须在编译swoole时加入--enable-openssl选项
$server = new Swoole\WebSocket\Server("0.0.0.0", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_TCP | SWOOLE_SSL);
$server->set(
	[
      'ssl_cert_file' => '证书',
       'ssl_key_file' => '/usr/local/nginx/conf/cert/214517325220006.key',
	]
);
$server->on('open', function (Swoole\WebSocket\Server $server, $request) {
    echo "server: handshake success with fd{$request->fd}\n";
});

$server->on('message', function (Swoole\WebSocket\Server $server, $frame) {
    echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";
    $server->push($frame->fd, "this is server");
});

$server->on('close', function ($ser, $fd) {
    echo "client {$fd} closed\n";
});

$server->start();

 

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是一些 WebSocket 常见问题: 1. WebSocket 是什么? WebSocket 是一种网络通信协议,它允许浏览器和服务器之间进行双向通信。 2. WebSocket 如何工作? WebSocket 在浏览器和服务器之间创建一个持久连接。一旦连接建立,数据就可以在浏览器和服务器之间双向传输,而不必通过多次 HTTP 请求和响应进行通信。 3. WebSocket 有哪些优点? WebSocket 具有以下优点: - 更快的响应速度:与传统的 HTTP 请求和响应相比,WebSocket 的响应速度更快。 - 更少的网络流量:WebSocket 通过持久连接在一次握手中完成,因此需要更少的网络流量。 - 双向通信:WebSocket 允许浏览器和服务器之间进行双向通信,这意味着服务器可以主动向浏览器发送数据。 4. WebSocket 有哪些缺点? WebSocket 缺点包括: - 兼容性问题:一些旧的浏览器可能不支持 WebSocket。 - 安全问题:WebSocket 的持久连接可能会被黑客利用,因此需要进行安全防护。 - 长时间连接:WebSocket 的长时间连接可能会对服务器造成负担。 5. WebSocket 与 HTTP 有什么区别? WebSocket 与 HTTP 的区别包括: - WebSocket 是双向通信协议,而 HTTP 是单向通信协议。 - WebSocket 需要进行一次握手,而 HTTP 每次请求都需要进行握手。 - WebSocket 采用持久连接,而 HTTP 是短连接。 6. WebSocket 如何实现? WebSocket 的实现需要客户端和服务器端的支持。在客户端,可以使用 JavaScript 的 WebSocket API。在服务器端,可以使用各种编程语言的 WebSocket 库,例如 Python 的 Tornado 和 Node.js 的 ws。 7. WebSocket 是否需要 SSL? WebSocket 可以使用 SSL 进行加密,这样可以提高安全性。但是,如果只是在内部网络中使用 WebSocket,则不一定需要 SSL。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值