双端时间不同步导致连接失败

如果双端时间不一致,可能会引发加密信道协商出问题。

  • 主机端可能由于电池失效,导致时钟出错。在未联网状态下,无法获取准确时间。
  • 手机端手动设置一个错误时间的概率比较低。

底层信道不支持加密时

如果在底层信道不支持加密,libp2p 提供了tls和noise两种加密。目前版本的默认值是先tls,后noise。

Noise

  • 与时间无关

TLS

  • 和时间有关,libp2p在生成证书时,证书有效期为一小时前到一百年后。https://github.com/libp2p/go-libp2p/blob/master/p2p/security/tls/crypto.go
  • libp2p校验证书使用"crypto/x509",该库校验证书时会比对证书有效期。可以设置当前时间,但未提供忽略。
  • 当某一端的时间错误地设置成未来,另一端就会报错。

底层信道支持加密时

如果在底层信道支持加密,libp2p直接使用信道提供的加密。

QUIC

未测试是否受时间影响

WebRTC

未测试是否受时间影响

WebTransport

未测试是否受时间影响

方案

方案A【暂定?】

初始化时手动指定优先使用noise。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import (
    "github.com/libp2p/go-libp2p/p2p/security/noise"
    tls "github.com/libp2p/go-libp2p/p2p/security/tls"
    // ...
)

libp2p.New(
    libp2p.Security(noise.ID, noise.New),
    libp2p.Security(tls.ID, tls.New),
    // ...
)

方案B【暂定?】

初始化时手动指定只使用noise,不使用tls。

  • 由于tls的实现要早于noise,所以放弃tls会与只使用tls的老p2p客户端不兼容。但不兼容对我们影响不大。
  • noise推出后,比tls的支持范围要普及。
  • 放弃tls可以减少一些库依赖。

方案C

修改libp2p库,比如让证书有效期为固定的前后一百年。或者修改x509的代码,使之不校验时间。

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计