带有TLS的etcdctl失败,curl成功

时间:2015-11-04 10:45:45

标签: ssl curl etcd

我有一个在docker容器中运行的etcd服务器,它实现了一个大小为1的etcd集群。它是通过发现服务初始化的。当我使用不安全的连接时一切都很好。但是,当我按照here所述切换到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

1 个答案:

答案 0 :(得分:1)

我自己解决了这个问题 - 我的TLS证书不正确。令我困惑的是,etcdctl向群集发出两个请求,而curl只生成一个请求。 Etcdctl使用作为-C提供的地址查询集群成员以发现公布的端点,然后针对所请求数据的一个返回地址发出第二个请求。 Curl只查询为数据提供的地址(相当明显)。我的证书对广告端点无效(i,.e。上面使用的.1.2.3.4)。因此,使用curl验证etcd集群并不是非常可靠。