自签名证书需要手动确认风险导致nginx转发无效问题
众所周知,采用https的站点中,页面不能有指向http的链接,因为这些链接根本无效。那如果真的需要连接http怎么办,我通常是用nginx做转发,将http转发为https地址。这些都是老套路了,所以我前一阵子,因为业主要求加强安全性,将一个http站点改造成https,轻车熟路,三下五除二,很快搞定。
但问题就来了。改造后的https站点,其他功能都正常,就是视频播放不了。视频播放地址原本是一个ws(部署在同一台服务器上的websocket,服务器的IP是10.0.1.26),支持http;做转发后变成wss,支持https。具体转发的配置如下
1)nginx下的转发配置:
# 转发WebSocket请求location /optc/ {# 后端WebSocket服务地址proxy_pass http://10.0.1.26:8888;# WebSocket必备配置proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_set_header Host $host;proxy_cache_bypass $http_upgrade;# 增加超时设置(根据需要调整)proxy_connect_timeout 60s;proxy_read_timeout 300s;proxy_send_timeout 60s;}
2)页面中使用该转发(最后一句)
const player = mpegts.createPlayer({enableWorker: true,type: "flv",isLive: true,liveBufferLatencyChasing: true,hasAudio: false,hasVideo: true,// 使用Nginx配置的域名和WSS协议url: `wss://10.0.1.26/optc/?url=rtsp://admin:123456@10.0.1.87554/mpeg4`,
});
后来发现,问题出在自签名证书。https需要证书,但我这个证书是自己签发的,浏览器根本不认,所以第一次打开时,浏览器会提示风险,问你是否需要继续?如下图。此时需要点击确定,继续下一步才能打开

我在服务器上测试的时候,使用的地址是https://localhost,首次使用时浏览器会弹出警告,确认后进入下一步。但是,nginx配置中,我用的是服务器的IP(10.0.1.26),这个地址并没有经过警告确认,所以就打不开了。
解决办法也简单,在服务器上用https://10.0.1.26访问,经过一次警告确认就可以了。
