1

我有一个在 docker 容器中运行的单个 etcd 服务器,实现了一个大小为 1 的 etcd 集群。它是通过发现服务初始化的。当我使用不安全的连接时,一切都很好。但是,当我按照此处所述切换到 TLS 安全通信时, etcdctl 无法工作。但是,cli curl 命令可以正常工作。

这是一个使用带有自签名证书的 TLS 从容器中通过 etcdctl 访问 etcd 的示例。使用 openssl 客户端,我可以验证我的 TLS 通信...

# openssl s_client -connect 172.17.42.1:2379 -cert /etc/ssl/infra/cert.pem -key /etc/ssl/infra/key.pem -CAfile /etc/ssl/infra/ca.pem -tls1

CONNECTED(00000003)
depth=1 C = GB, O = acme.net, OU = Some Services, L = London, ST = England, CN = Ecme CA
verify return:1
depth=0 O = autogenerated, OU = etcd cluster, L = the internet, CN = etcd
verify return:1
---
 Certificate chain
 0 s:/O=autogenerated/OU=etcd cluster/L=the internet/CN=etcd
   i:/C=GB/O=acme.net/OU=Some Services/L=London/ST=England/CN=Acme CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MIIDlzCCAoGgAwIBAgIIYf3y1uiPRu8wCwYJKoZIhvcNAQELMH0xCzAJBgNVBAYT
AkdCMRUwEwYDVQQKEwxVbmJsb2Nrci5uZXQxHjAcBgNVBAsTFUdlbyBMb2NhdGlv
....

但试图使用 etcdctl 做一个成员列表

root@2aff45e6c288:/# etcdctl --debug -C https://172.17.42.1:2379 --ca-file /etc/ssl/infra/ca.pem --cert-file /etc/ssl/infra/cert.pem --key-file /etc/ssl/infra/key.pem member list
start to sync cluster using endpoints(https://172.17.42.1:2379)
cURL Command: curl -X GET https://172.17.42.1:2379/v2/members
got endpoints(https://1.2.3.4:2379) after sync
Cluster-Endpoints: https://1.2.3.4:2379
cURL Command: curl -X GET https://1.2.3.4:2379/v2/members
client: etcd cluster is unavailable or misconfigured

所以有些东西很无聊(尽管它似乎已经与 etcd 集群交谈并找到了成员(只有一个)

一个简单的curl命令按我的预期工作

root@2aff45e6c288:/# curl --cacert /etc/ssl/infra/ca.pem --cert /etc/ssl/infra/cert.pem --key /etc/ssl/infra/key.pem -X GET https://172.17.42.1:2379/v2/members
{"members":[{"id":"2b3b4588bc2bae1e","name":"default","peerURLs":["http://1.2.3.4:2380"],"clientURLs":["https://1.2.3.4:2379"]}]}

我不知道下一步该做什么。etcd 和 etcdctl 都是 v 2.0.9

4

1 回答 1

1

我自己解决了这个问题 - 我的 TLS 证书不正确。让我感到困惑的是,etcdctl 向集群发出了两个请求,而 curl 只发出了一个。Etcdctl 使用作为 -C 提供的地址查询集群成员以发现通告的端点,然后针对所请求数据的返回地址之一发出第二个请求。Curl 只是查询为数据提供的地址(很明显)。我的证书对于广告的端点(即上面使用的 1.2.3.4)无效。因此,使用 curl 来验证 etcd 集群不是很可靠。

于 2015-11-04T15:24:19.727 回答