SFU-Ion服务器启用TLS后Flutter客户端无法连接问题排查
问题
禁用TLS运行SFU-Ion服务器时,Flutter客户端通过http://[domain_name]:5551可正常进行音视频通话。启用TLS(使用密钥文件)后,服务器运行无错误日志,看似正常,但Flutter客户端通过https://[domain_name]:5551无法连接,且服务器端无任何连接日志。
当前配置文件
sfu.toml
[global] # data center id dc = "dc1" [nats] url = "nats://nats:4222" [sfu] ballast = 0 withstats = false [router] maxbandwidth = 1500 maxpackettrack = 500 audiolevelthreshold = 40 audiolevelinterval=1000 audiolevelfilter = 20 [router.simulcast] bestqualityfirst = true enabletemporallayer = false [webrtc] singleport = 5000 sdpsemantics = "unified-plan" mdns = true [webrtc.candidates] nat1to1 = ["45.45.45.45"] # public ip icelite = true [webrtc.timeouts] disconnected = 5 failed = 25 keepalive = 2 [turn] enabled = true realm = "ion" address = "0.0.0.0:3478" [turn.auth] credentials = "pion=ion,pion2=ion2" [log] v = 1
signal.toml
[global] dc = "dc1" [log] level = "info" [nats] url = "nats://nats:4222" [signal.grpc] host = "0.0.0.0" port = "5551" allow_all_origins = true cert= "configs/certs/cert.pem" key= "configs/certs/key.pem" [signal.jwt] enabled = false key_type = "HMAC" key = "1q2dGu5pzikcrECJgW3ADfXX3EsmoD99SYvSVCpDsJrAqxou5tUNbHPvkEFI4bTS" [signal.svc] services = ["rtc", "room"]
docker-compose.yml
version: "3.7" services: islb: image: pionwebrtc/ion:latest-islb build: dockerfile: ./docker/islb.Dockerfile context: . volumes: - "./configs/docker/islb.toml:/configs/islb.toml" depends_on: - nats - redis networks: - ionnet sfu: image: pionwebrtc/ion:latest-sfu build: dockerfile: ./docker/sfu.Dockerfile context: . volumes: - "./configs/docker/sfu.toml:/configs/sfu.toml" ports: - "5000:5000/udp" - 3478:3478 depends_on: - nats - islb networks: - ionnet signal: image: pionwebrtc/ion:latest-signal build: dockerfile: ./docker/signal.Dockerfile context: . volumes: - "./configs/docker/signal.toml:/configs/signal.toml" - "/etc/letsencrypt/archive/domain_name:/configs/certs" ports: - 5551:5551 depends_on: - islb - app-room networks: - ionnet app-room: image: pionwebrtc/ion:latest-app-room build: dockerfile: ./docker/app-room.Dockerfile context: . volumes: - "./configs/docker/app-room.toml:/configs/app-room.toml" depends_on: - nats - redis - islb networks: - ionnet nats: image: nats ports: - 4222:4222 networks: - ionnet redis: image: redis:6.0.9 ports: - 6379:6379 networks: - ionnet networks: ionnet: name: ionnet driver: bridge
补充信息
服务器使用Certbot生成的TLS证书,尝试安全连接时,服务器和客户端均无连接日志或错误信息。
分析与解决
大概率是这几个问题
- 证书路径或权限不对:Certbot生成的证书挂载到容器后,可能出现文件无法读取、权限不足的情况,容器内用户没有证书读取权限。
- 证书链不完整:仅使用
cert.pem无法提供完整证书链,客户端会因无法验证证书有效性拒绝连接,需要用包含中间证书的fullchain.pem。 - Flutter客户端gRPC TLS配置错误:Ion的signal服务基于gRPC,Flutter连接时可能未正确配置证书验证,或设备未信任Let's Encrypt根证书。
- 端口或防火墙拦截流量:5551端口的TLS流量可能被防火墙阻断,或signal服务未正确监听TLS端口。
一步步排查解决
1. 验证容器内证书可用性
- 进入signal容器检查证书:
docker exec -it <你的signal容器ID> bash ls -l /configs/certs/ cat /configs/certs/cert.pem - 调整
signal.toml的证书配置,替换为Certbot的完整链文件:cert= "configs/certs/fullchain.pem" key= "configs/certs/privkey.pem" - 确保宿主机证书目录权限为
755,文件权限为644,或临时在docker-compose的signal服务中添加user: root测试。
2. 检查signal服务TLS加载状态
- 修改
signal.toml的日志级别为debug:[log] level = "debug" - 重启服务并查看日志:
若日志中无TLS初始化相关内容,说明配置路径或格式错误。docker-compose restart signal docker-compose logs -f signal
3. 测试本地TLS连通性
- 在服务器上用openssl测试5551端口:
连接失败说明服务未监听TLS端口;证书验证失败则是证书链问题。openssl s_client -connect localhost:5551
4. 调整Flutter客户端gRPC配置
- 测试环境可临时跳过证书验证(生产环境禁用):
生产环境需确保客户端能验证完整证书链。final channel = ClientChannel( '你的域名', port: 5551, options: ChannelOptions( credentials: ChannelCredentials.secure( onBadCertificate: (cert, host) => true, ), ), );
5. 检查防火墙与端口映射
- 开放服务器5551端口的TCP流量:
ufw allow 5551/tcp - 确认docker-compose中
5551:5551为TCP端口映射(gRPC默认使用TCP)。
内容的提问来源于stack exchange,提问作者Mir Injamamul
相关产品推荐
相关产品推荐

