You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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"
    
  • 重启服务并查看日志:
    docker-compose restart signal
    docker-compose logs -f signal
    
    若日志中无TLS初始化相关内容,说明配置路径或格式错误。

3. 测试本地TLS连通性

  • 在服务器上用openssl测试5551端口:
    openssl s_client -connect localhost:5551
    
    连接失败说明服务未监听TLS端口;证书验证失败则是证书链问题。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:18:11