自签证书部署网站SRS拉流失败,浏览器提示ERROR_CERT_INVALID怎么办?

新手上路,请多包涵

在线上环境使用自签证书部署的网站, 网页浏览正常,只是执行SRS拉流失败,浏览器控制台提示”ERROR_CERT_INVALID".原始视频流地址是https://X.X.X.211:8082/live/sn.flv?token=123456
后端和SRS配置中均已经启用了https功能,而且我在VLC中可以拉流成功,在浏览器中已经安装了自签证书,也可以查看到证书(受信任的根证书)信息没有问题,其中CN=X.X.X.211。
请问有什么办法可以让我在网站中可以正常拉取.flv视频流

阅读 692
avatarAI BotBETA

问题分析

浏览器提示 ERROR_CERT_INVALID 表示自签证书在拉取 FLV 流时未被信任,尽管证书已安装为受信任的根证书。常见原因包括:

  • 证书 SANs 缺失:浏览器要求证书的 Subject Alternative Names (SANs) 包含请求的 IP 地址(如 X.X.X.211),而不仅仅是 Common Name (CN)。自签证书默认可能只设置 CN,导致浏览器不信任。
  • 浏览器安全策略:现代浏览器(如 Chrome、Firefox)对自签证书的验证更严格,尤其涉及媒体流(如 FLV),即使证书已安装,也可能因缓存或策略问题拒绝连接。
  • 端口问题:请求使用非标准端口 8082,浏览器可能对非 443 端口的 HTTPS 有额外检查。
  • VLC 成功的原因:VLC 等媒体播放器通常忽略证书错误,但浏览器强制执行 HTTPS 验证,导致拉流失败。

解决方案

以下是解决步骤,重点在重新生成证书并配置 SANs。确保操作在服务器端进行,然后更新 SRS 配置。

1. 重新生成自签证书,包含 SANs 扩展

  • 使用 OpenSSL 生成新证书,添加 subjectAltName 扩展以包括 IP 地址 X.X.X.211
  • 在服务器上运行以下命令(替换 X.X.X.211 为实际 IP):

    # 生成私钥和证书,包含 SANs
    openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -days 365 -nodes -subj "/CN=X.X.X.211" -addext "subjectAltName=IP:X.X.X.211"
    • 这将创建 key.pem(私钥)和 cert.pem(证书)文件。
    • 验证证书内容:运行 openssl x509 -in cert.pem -text -noout,检查输出中是否包含 X509v3 Subject Alternative Name: IP Address:X.X.X.211

2. 更新 SRS 配置以使用新证书

  • 编辑 SRS 配置文件(通常位于 /usr/local/srs/conf/srs.conf 或类似路径),确保 HTTPS 部分正确引用新证书:

    http_server {
        enabled on;
        listen 8082;  # 确保端口匹配
        https {
            enabled on;
            key ./key.pem;  # 私钥路径
            cert ./cert.pem; # 证书路径
        }
    }
  • 重启 SRS 服务使配置生效:

    sudo systemctl restart srs
    # 或使用 srs 命令:sudo ./objs/srs -c conf/srs.conf

3. 在浏览器中更新证书信任

  • 卸载旧证书:在浏览器设置中移除之前安装的自签证书(例如,在 Chrome 中:Settings > Privacy and Security > Security > Manage Certificates > Trusted Root Certification Authorities)。
  • 安装新证书

    • 将新生成的 cert.pem 文件下载到本地。
    • 在浏览器中导入为受信任的根证书(Chrome:同上路径,点击 "Import";Firefox:Options > Privacy & Security > View Certificates > Authorities > Import)。
    • 确保导入时选择 "Trust this certificate for identifying websites"。
  • 清除浏览器缓存:重启浏览器或使用隐身模式测试,避免缓存影响。

4. 测试和验证

  • 检查证书信任:在浏览器中访问 https://X.X.X.211:8082(不带流路径),确认无证书警告。如果仍有错误,检查 SANs 是否正确。
  • 测试拉流:在网页中嵌入 FLV 播放器(如使用 flv.js),尝试拉取 https://X.X.X.211:8082/live/sn.flv?token=123456。使用浏览器开发者工具(F12 > Console/Network)查看详细错误。
  • 备选测试:如果问题依旧,尝试:

    • 使用不同浏览器(如 Firefox 可能更宽松)。
    • 临时使用 HTTP 拉流(如果安全允许):修改 SRS 配置禁用 HTTPS,并测试 http://X.X.X.211:8082/...。但线上环境建议坚持 HTTPS。

额外建议

  • 为什么 SANs 很重要:浏览器如 Chrome 从 v58 起要求 SANs 包含 IP 地址,否则 CN 会被忽略。你的证书 CN 是 X.X.X.211,但缺少 SANs 扩展,导致无效错误。
  • SRS 文档参考:确保 SRS 版本支持 HTTPS(v4.0+ 推荐)。查看 SRS HTTPS 文档 确认配置。
  • 长期方案:线上环境建议使用免费证书(如 Let's Encrypt)替代自签证书,避免浏览器兼容问题。Let's Encrypt 支持 IP 证书,但需验证域名控制。
  • 调试工具:使用 curl -v https://X.X.X.211:8082openssl s_client -connect X.X.X.211:8082 检查证书链和错误详情。

如果问题持续,提供更多细节(如浏览器类型、SRS 版本和证书生成日志),以便进一步诊断。

1 个回答

所以我们选择了zlmediakit

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题