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