Dragonfly2 icon indicating copy to clipboard operation
Dragonfly2 copied to clipboard

SeedPeer的TLS配置相关问题

Open chisaato opened this issue 3 years ago • 7 comments

image 如图,这些地方如果打开了 TLS 则需要填写证书. 那这个证书是可以用自己签发的,还是常规 CA 签发的? image 而此处可以从 manager 签发证书,那这个证书是否可以用于上面的服务呢? 如果可以,这也许是一个新的 Feature

还是说文档还没完善到这一步? 暂且没有参考?

chisaato avatar Dec 02 '22 23:12 chisaato

只要是 CA 就可以了,谁签发的都一样。上一个 issue 功能我已经实现完了,参考 #1887。 具体文档是需要完善一下,有兴趣可以在官网 Reference 帮忙完善一个 Security 的文档。

![image](https://user-images.githubusercontent.com/15955374/208399997-54f8cf26-0773-462c-bc99-1216aafecd76.png

官网项目维护在 https://github.com/dragonflyoss/d7y.io

gaius-qi avatar Dec 19 '22 10:12 gaius-qi

12月23日拉取 latest 镜像进行测试的时候发现,IP解析有问题 image manager 镜像的 digest 为 8b002ac2cbcd797e6bee714065f03c6686ff2590c80ce7f59eae127eb06cae8e manager与peer都有该问题

chisaato avatar Dec 23 '22 07:12 chisaato

暂且研究出几个结果, 在 2.0.9 alpha8 中,发现了一个新的选项 ~~(也许是新的,毕竟文档没写)~~ syncPieceViaHTTPS 这个文档没有说. 打开之后可以在节点之间的请求使用 HTTPS. 但是代码处理有一些问题,此处暂且不表,我会单独开一个 issue 说明

根据此处定义

https://github.com/dragonflyoss/Dragonfly2/blob/7d7984d3bb36efbc5f5067ef9b381ec58cbd5829/client/config/peerhost.go#L309

这个选项要放在 download 节点下

download:
  syncPieceViaHTTPS: true

经确认确实开启了使用 HTTPS 请求其他节点

image

chisaato avatar Jan 08 '23 22:01 chisaato

但是同样的, 请求中打码的部分是 IP 也就意味着他在使用 IP+HTTPS. 这给签发证书带来了问题. 签发一张合法的 IP SSL 证书并不容易.

image 此处我配置的是 Let's Encrypt 签发的域名证书,自然是不包含 IP SAN 的. 所以请求失败了.

希望此处可以改进一下,使用 Peer 报告给 Manager 的主机名进行连接. 或者在 autoIssue 之后自动装配上自签名证书.

chisaato avatar Jan 08 '23 22:01 chisaato

但是同样的, 请求中打码的部分是 IP 也就意味着他在使用 IP+HTTPS. 这给签发证书带来了问题. 签发一张合法的 IP SSL 证书并不容易.

image 此处我配置的是 Let's Encrypt 签发的域名证书,自然是不包含 IP SAN 的. 所以请求失败了.

希望此处可以改进一下,使用 Peer 报告给 Manager 的主机名进行连接. 或者在 autoIssue 之后自动装配上自签名证书.

@chisaato 请问你最后是怎么解决给peer签发server证书的呢,目前最新版的我试了下也还是sans校验的问题

karlhjm avatar Aug 13 '24 03:08 karlhjm

如果把upload.security.insecure设置为false无法从其他peer通过https下载,因为server证书校验不能通过,只能设置为true

比如peer配置如下,peer之间开启了https下载,但是 peer 在 upload 的 65002 端口的server证书使用的是我自签发的,不是自动生成的

download:
  calculateDigest: true
  syncPieceViaHTTPS: true
  downloadGRPC:
    security:
      insecure: false
      caCert: /etc/d7y-root-ca-key/ca.crt
      cert: /etc/d7y-peer-server-cert/server.crt
      key: /etc/d7y-peer-server-cert/server.key
      tlsVerify: true
    unixListen:
      socket: ""
  peerGRPC:
    security:
      insecure: false
      caCert: /etc/d7y-root-ca-key/ca.crt
      cert: /etc/d7y-peer-server-cert/server.crt
      key: /etc/d7y-peer-server-cert/server.key
      tlsVerify: true
    tcpListen:
      port: 65000
  perPeerRateLimit: 512Mi
  prefetch: false
  totalRateLimit: 1024Mi
upload:
  rateLimit: 1024Mi
  security:
    insecure: false
    caCert: /etc/d7y-root-ca-key/ca.crt
    cert: /etc/d7y-peer-server-cert/server.crt
    key: /etc/d7y-peer-server-cert/server.key
    tlsVerify: true
  tcpListen:
    port: 65002

由于 uploadListener 调用 prepareTCPListener 这里写死了 true https://github.com/dragonflyoss/Dragonfly2/blob/55473074450570fb560ee0587c14b52c74561f0c/client/daemon/daemon.go#L619 导致 uploadListener 直接就使用了自签发的 server 证书 https://github.com/dragonflyoss/Dragonfly2/blob/55473074450570fb560ee0587c14b52c74561f0c/client/daemon/daemon.go#L544 https://github.com/dragonflyoss/Dragonfly2/blob/55473074450570fb560ee0587c14b52c74561f0c/client/daemon/daemon.go#L569 而peer 65000 grpc 端口由于写死了 false,并不会使用配置里的自签发server证书,使用的是后续动态生成的 server 证书 https://github.com/dragonflyoss/Dragonfly2/blob/55473074450570fb560ee0587c14b52c74561f0c/client/daemon/daemon.go#L608

karlhjm avatar Aug 13 '24 04:08 karlhjm

我记忆里是丢了个能跑的证书先让他起来,我再改配置用服务端签发下来的证书,同时ca分发到每个节点上 现在想想也许给所有节点套个 Tailscale 再配 HTTP 或许还轻松点?

当初提issue的时候我还是用compose搭的,现在已经全面转向K3S了,再也不自己倒腾每一行配置了,太费劲

chisaato avatar Aug 13 '24 16:08 chisaato

Please refer to https://d7y.io/docs/next/operations/best-practices/security/#mutual-tls.

gaius-qi avatar Apr 23 '25 09:04 gaius-qi