海康摄像头通过SRS流媒体服务器实现HTTPS安全播放全攻略

张开发
2026/4/21 16:51:39 15 分钟阅读

分享文章

海康摄像头通过SRS流媒体服务器实现HTTPS安全播放全攻略
1. 环境准备与基础搭建最近在帮朋友部署一套安防监控系统时发现海康摄像头直接暴露在公网存在安全隐患。经过多次测试终于找到了一套既安全又稳定的方案通过SRS流媒体服务器中转视频流再用Nginx配置HTTPS加密传输。下面就把完整的实现过程分享给大家。首先需要准备一台Ubuntu 22.04服务器配置建议至少2核4G。我实测发现这个配置可以稳定支持5路1080P视频流同时传输。系统安装完成后记得先执行sudo apt update sudo apt upgrade -y更新系统组件。SRS服务器的安装比想象中简单很多官方提供了完善的安装脚本。我推荐使用源码编译安装可以获得更好的性能优化。具体步骤如下git clone https://github.com/ossrs/srs.git cd srs/trunk ./configure --gb28181on make -j4 sudo make install这里特别要注意--gb28181on参数这是支持海康摄像头GB/T28181协议的关键。有次我忘记加这个参数调试了半天才发现问题所在。2. SRS服务器深度配置安装完成后需要重点配置conf/srs.conf文件。建议先备份原始配置然后新建一个专门用于海康摄像头的配置文件listen 1935; max_connections 1000; daemon on; pid ./objs/srs.pid; srs_log_tank file; srs_log_file ./objs/srs.log; http_api { enabled on; listen 1985; } http_server { enabled on; listen 8080; dir ./objs/nginx/html; } rtc_server { enabled on; listen 8000; } gb28181 { enabled on; listen 9000; sip { serial 34020000002000000001 realm 3402000000 server_id 3402000000 password admin123 } }其中GB28181配置段需要特别注意serial建议修改为实际设备编号password要设置足够复杂我就遇到过被暴力破解的情况realm和server_id需要与摄像头配置保持一致配置完成后用sudo systemctl start srs启动服务。建议设置开机自启sudo cp ./objs/srs.service /etc/systemd/system/ sudo systemctl enable srs3. 海康摄像头对接实战现在来到最关键的设备对接环节。以DS-2DE3304W-DE型号为例登录摄像头管理后台进入网络 高级配置 平台接入选择GB/T28181协议填写服务器地址为SRS服务器IP端口填写9000与SRS配置一致设备ID格式为34020000001320000001认证密码填写SRS配置中的密码这里有个坑要注意海康摄像头的设备ID必须与SRS配置的realm前缀一致。比如realm是3402000000设备ID就必须是3402000000开头。对接成功后在SRS日志中应该能看到类似这样的记录[GB] SIP register success, id34020000001320000001如果遇到注册失败建议按这个顺序排查检查防火墙是否开放了9000端口确认密码是否匹配验证设备ID格式检查网络连通性4. HTTPS安全加固方案原始视频流通过HTTP传输存在被窃听的风险我们需要用Nginx配置HTTPS加密。这里以Lets Encrypt免费证书为例sudo apt install certbot sudo certbot certonly --standalone -d yourdomain.com证书获取后配置Nginx反向代理。这是我的生产环境配置经过多次优化server { listen 80; server_name yourdomain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl; server_name yourdomain.com; ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:MozSSL:10m; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256; ssl_prefer_server_ciphers on; location /live/ { proxy_pass http://127.0.0.1:8080/live/; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 重要保持长连接 proxy_http_version 1.1; proxy_set_header Connection ; # 缓存设置 proxy_cache srs_cache; proxy_cache_valid 200 302 10s; proxy_cache_key $scheme://$host$request_uri; } location /players/ { proxy_pass http://127.0.0.1:8080/players/; } }这个配置有几个优化点强制HTTPS跳转使用更安全的TLS 1.2/1.3添加了视频流缓存优化了长连接设置5. 播放地址生成与测试一切就绪后可以通过以下地址访问视频流FLV格式https://yourdomain.com/live/34020000001320000001.flvHLS格式https://yourdomain.com/live/34020000001320000001.m3u8我推荐使用开源的flv.js播放FLV流或者hls.js播放HLS流。在Vue项目中可以这样集成import flvjs from flv.js this.player flvjs.createPlayer({ type: flv, url: https://yourdomain.com/live/34020000001320000001.flv }) this.player.attachMediaElement(this.$refs.video) this.player.load() this.player.play()如果遇到播放问题建议按这个顺序排查检查Nginx错误日志tail -f /var/log/nginx/error.log验证SRS流是否正常直接用HTTP地址测试检查证书是否过期确认跨域配置是否正确6. 性能优化与监控长期运行后我发现几个性能瓶颈点需要特别注意TCP连接数限制# 查看当前限制 cat /proc/sys/net/core/somaxconn # 临时修改 sudo sysctl -w net.core.somaxconn65535SRS日志轮转sudo vim /etc/logrotate.d/srs添加以下内容/usr/local/srs/objs/srs.log { daily rotate 7 missingok notifempty compress delaycompress sharedscripts postrotate kill -USR1 cat /usr/local/srs/objs/srs.pid endscript }Nginx缓存优化 在http段添加proxy_cache_path /var/cache/nginx levels1:2 keys_zonesrs_cache:10m inactive60m use_temp_pathoff;建议部署监控系统我用的是Prometheus Grafana方案。SRS内置了Prometheus指标接口配置很简单location /metrics { proxy_pass http://127.0.0.1:1985/api/v1/metrics; }7. 常见问题解决方案在实际部署中我遇到过这些典型问题问题1摄像头频繁掉线解决方案检查SRS的keepalive配置调整摄像头的心跳间隔排查网络抖动问题问题2HTTPS播放卡顿解决方案优化Nginx的ssl_buffer_size开启TCP快速打开调整SSL会话缓存问题3多路视频流延迟不同步解决方案统一使用TCP协议传输调整SRS的gop_cache参数确保所有摄像头时间同步有次客户反映夜间视频流中断排查发现是证书自动续期失败导致的。现在我都设置定时任务提前续期0 3 * * * /usr/bin/certbot renew --quiet --post-hook systemctl reload nginx8. 高级功能扩展对于需要更高安全性的场景可以考虑这些增强方案IP白名单限制location /live/ { allow 192.168.1.0/24; deny all; # 其他proxy配置... }H.265编码支持 在SRS配置中添加encoder { enabled on; output h265; # 其他参数... }WebRTC低延迟直播rtc_server { enabled on; listen 8000; # 其他配置... }播放地址变为webrtc://yourdomain.com/live/34020000001320000001这套方案在我负责的多个项目中运行稳定最长的已经持续工作300多天。关键是要做好日常监控和定期维护特别是证书管理和日志清理。

更多文章