SRS + Oryx 一键配置 HTTPS:Let's Encrypt 免费证书 3 步搞定,自动续期零运维
【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs
给 SRS 流媒体服务配上 HTTPS,在 Oryx(原 SRS Stack)里只需要一次点击。它内置了 Let's Encrypt 免费证书的申请与续期能力,域名填进去、提交,Oryx 就会自动完成证书签发、挂载到 Nginx,并且每天检查一次到期时间,快过期时静默续期——你几乎不用碰任何命令行。
什么时候你会被 HTTPS 卡住?
两个场景最常见:
- 浏览器推流推不上去。用 WebRTC(WHIP)从浏览器推送摄像头画面时,浏览器只在安全上下文(HTTPS 或 localhost)里放行麦克风和摄像头权限。HTTP 页面上,
getUserMedia直接被拒,推流无从谈起; - 嵌进 HTTPS 网站后播放器转圈。WordPress 之类的站点本身是 HTTPS 的,页面里如果加载 HTTP 的 HLS/FLV 播放地址,浏览器会以 mixed content(混合内容)策略直接拦截,播放器黑屏。
换句话说,只要你的流要被浏览器用到,或者要被别的 HTTPS 网站引用,SRS 就必须走加密通道。
还有一件让事情变简单的事:Oryx 的 SRS Droplet 默认按单域名工作。一个实例对一个域名,证书怎么申请、怎么续期,都不会有多域名交叉配置的麻烦。
Oryx 本身是一个单节点一体化应用:SRS 负责底层 RTMP/WebRTC/HLS/SRT 等流媒体能力,外面包着 FFmpeg、Go 后端、React 控制台、Redis 和 NGINX。自动 HTTPS 正是 Oryx 在这一层封装出来的用户工作流之一,架构细节可以参考仓库里的 skills/srs-support/references/oryx-overview.md。
动手前的两样东西
- 一个装好 Oryx 的 SRS Droplet:按"一键搭建视频流服务"的流程完成安装与初始化即可,容器启动时记得把宿主机的目录挂到容器内
/data(证书、Redis 数据、生成的配置都落在这里); - 一个能注册、能改 DNS 的域名。本文用
your_domain_name代指域名,your_public_ipv4代指服务器公网 IP,操作时替换成真实值。
另外确认云厂商安全组里宿主机80和443端口对公网放行:80 端口要留给 Let's Encrypt 做验证,443 用来提供 HTTPS 访问。
第 1 步:把域名指到服务器
在域名解析后台为your_domain_name加一条A 记录,指向公网 IP:
A your_domain_name your_public_ipv4等几分钟后验证解析是否生效:
ping your_domain_name只要回显里的 IP 是你的your_public_ipv4,解析就通了。这一步为什么必须做?Let's Encrypt 的 HTTP/ACME challenge 会主动访问你的域名来验证控制权,域名解析不到你的机器,后面的申请必然失败。
此时用浏览器打开http://your_domain_name/mgmt,能正常看到 Oryx 控制台页面,说明 HTTP 链路也通了。
第 2 步:控制台里一键签发证书
进入控制台,走System(系统)→ HTTPS → Let's Encrypt页面,在输入框填入your_domain_name,点Submit。
剩下的是 Oryx 的后台工作:它通过内置的LEGO(一个自动化的 ACME 客户端库)对接 Let's Encrypt 服务器,创建并应答 challenge 证明你控制着这个域名,然后拿回签发的证书。整个过程没有人工步骤,也没有要填的私钥、邮箱之类东西。
申请成功后,把地址换成https://your_domain_name/mgmt重新加载页面。看到地址栏出现安全锁标识,说明证书已经挂到 Nginx 上并生效了。
想同时覆盖主域和 www?输入框里用分号分隔多个域名即可,例如domain.com;www.domain.com,前提是每一个域名都配好了 A 记录。提交后https://domain.com和https://www.domain.com会一起可用。
第 3 步:确认证书会自己续期
Let's Encrypt 签发的证书有效期大约 3 个月,手动管理就是灾难。Oryx 的做法是:起一个每天执行一次的定时任务,检查证书到期时间,该续就续,必要时重载 Nginx 让新证书立即生效。
一条命令就能确认这个机制在跑:
docker logs platform |grep renew看到类似下面的输出,且没有报错,就说明自动续期已就绪:
Thread #crontab: auto renew the Let's Encrypt ssl Thread #crontab: renew ssl updated=false, message is Processing /etc/letsencrypt/renewal/lh.ossrs.io.conf Certificate not yet due for renewal The following certificates are not due for renewal yet: No renewals were attempted.updated=false表示"还没到续期时间,什么都没做",这是健康状态。此后证书会一直保持有效,不需要你记任何日期。
证书背后:Oryx 和 SRS 各干了什么
一键操作看似省事,值得花两分钟搞懂分工,出问题时才知道去哪查。
Oryx 侧的三个角色:
- LEGO:负责申请与续期证书,是自动 HTTPS 的核心引擎;
- NGINX:证书生效后由它对外提供 HTTPS 访问与反向代理,控制台、OpenAPI、信令、媒体分发都从这条加密通道出去;
/data持久化目录:证书文件、Oryx 自动生成的 SRS 与 NGINX 配置、Redis 数据全在这里。容器重启、升级不丢,前提是挂载了持久卷。
端口映射上,Oryx 默认把宿主机443/TCP映射到容器内2443/TCP(HTTPS 控制台、API、信令与媒体分发),80/TCP映射到2022/TCP(HTTP 访问)。所以 Let's Encrypt 申请成功之后,https://your_domain_name/mgmt就是 Nginx 拿着这张真实证书在提供服务。
SRS 侧的 HTTPS 配置长什么样?如果你不用 Oryx、跑的是裸 SRS,HTTPS 同样是原生支持的。仓库自带的 trunk/conf/https.srs.conf 给了完整示例,http_server和http_api各自都能独立开启一个加密监听:
http_server { enabled on; listen 8080; https { enabled on; listen 8088; key ./conf/server.key; cert ./conf/server.crt; } } http_api { enabled on; listen 1985; https { enabled on; listen 1990; key ./conf/server.key; cert ./conf/server.crt; } }逐条看:enabled on打开 HTTPS 监听;listen 8088/listen 1990分别是 HTTP 服务(8080)与 API 服务(1985)对应的加密端口;key和cert指向私钥与证书文件。同目录下还有 trunk/conf/https.docker.conf、trunk/conf/https.rtc.conf、trunk/conf/https.hls.conf,分别覆盖 Docker、WebRTC、HLS 三种场景;trunk/conf/server.crt 与 trunk/conf/server.key 是随仓库附带的自签名示例证书,本地调试可用,生产环境请换成 Let's Encrypt 这类 CA 签发的。
WebRTC 场景多一个细节:rtc_server段要配candidate(对应环境变量$CANDIDATE),保证 SDP 里通告给浏览器的候选地址真实可达。HTTPS 管的是信令与控制面的安全,UDP 8000 端口走媒体流,两者配合缺一不可,更多说明见 skills/internal-docs-for-srs/references/cpp-docs/doc/webrtc.md。
Oryx 与 SRS 配置的关系要注意一个坑:Oryx 会在/data下自动生成所需的 SRS 与 NGINX 配置,核心参数由/data/config/.env管理(如MGMT_PASSWORD管理员密码、CANDIDATEWebRTC 候选地址、AUTO_SELF_SIGNED_CERTIFICATE自签名证书开关)。启用 Let's Encrypt 后,Oryx 用它签发的真实证书替换默认自签名证书,NGINX 与 SRS 的 HTTPS 通道统一切换过来。不要把裸 SRS 的示例 conf 直接拷进 Oryx 环境覆盖自动生成的文件,两边结构不同,容易把服务搞挂。
边界与常见翻车点
- 以单域名为主:Oryx 的证书流程面向单域名设计(支持分号分隔的多域名),通配符(wildcard)证书这类高级玩法请对照 Oryx 官方文档确认是否支持;
- DNS 必须公网可达:解析不到你的公网 IP,ACME challenge 过不去,申请会卡死或失败。先
ping再点 Submit; /data必须持久化:这是单节点部署的命门。没挂持久卷时重建容器,证书、Redis 数据、生成的配置全部归零;- 安全组放行 80/443:80 不是"备用端口",它承担 Let's Encrypt 的验证流量。很多人只开了 443 导致首次申请失败;
- 容量受单机限制:Oryx 是单节点应用,并发路数、录制、转码与 HTTPS 分发共享同一台机器的资源,扩容需要自行规划多实例。
做完之后,你应该看到这些
按上面的顺序走完,逐项核对:
ping your_domain_name返回的是你的公网 IP;- 浏览器打开
https://your_domain_name/mgmt,地址栏有安全锁,控制台正常加载; - 用浏览器 WebRTC 推流(WHIP)能正常获取摄像头/麦克风权限并开始推流;
docker logs platform |grep renew输出里出现 crontab 续期记录且无报错,比如Certificate not yet due for renewal这类"暂无需续期"的提示。
四条都满足,你的 SRS Droplet 就具备了长期可用的完整 HTTPS 能力:浏览器推流合规,HLS/FLV/WebRTC 播放地址可以安心嵌进任何 HTTPS 网站,而证书这件事从此可以忘掉。
【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考