升级Https的那些事儿

1. 申请相关

照着腾讯云教程走了一遍没走啥弯路,懒得写了待填坑

2. WebSocket & Nginx

目前我的个人网站上只有一个基于ws模块的WebSocket聊天室,在服务器认证完https之后,发现原来的WebSocket失效了

Google浏览器的提示

当时只是觉得因为在前端没有将WebSocket的地址从ws://...更新为wss://...
后来在前端更改请求地址为wss://...以后仍然提示错误failed: Error in connection establishment: net::ERR_SSL_PROTOCOL_ERROR
查阅了别的朋友走过的坑才发现

const WebSocket = require('ws');
const server = new WebSocket.Server({port: 3000});

以这种方式建立的服务器不能处理经SSL加密过的请求,这种情况有两种解决方案:

  1. 利用Nginx反向代理,将服务器发给客户端的消息转发到/websocket路由上
    向Nginx配置文件中https部分添加location /websocket {...},如下所示
server {
        listen 443 ssl;
        # ...
        # 其他设置
        # ...
        location /websocket {
                proxy_pass http://localhost:3000;  # example
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection "upgrade";
        }
    }

之后重启Nginx服务

nginx -s reload

然后在前端使用

const ws = new WebSocket("wss://yourhost.com/websocket");

即可解决

  1. 在服务端以以下这种方式创建服务器(ws作者在GitHub上的建议):
const server = https.createServer({
  cert: fs.readFileSync('/etc/letsencrypt/live/xxx.xxx/fullchain.pem'),
  key: fs.readFileSync('/etc/letsencrypt/live/xxx.xxx/privkey.pem')
});

const wss = new WebSocket.Server({ server });

server.listen(4321);

即可通过端口方式请求wss

const ws = new WebSocket("wss://example.org:4321");

参考文章

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。