Ssl Hashicorp领事-如何从Kubernetes集群中的POD执行已验证的TLS
我很难理解领事的端到端TLS。作为参考,我在Kubernetes使用了Concur(通过hashicorp/concurHelm图表)。只有一个数据中心和Kubernetes群集-没有外部参与方或顾虑 我已将覆盖值.yaml文件配置为:Ssl Hashicorp领事-如何从Kubernetes集群中的POD执行已验证的TLS,ssl,kubernetes,https,consul,consul-kv,Ssl,Kubernetes,Https,Consul,Consul Kv,我很难理解领事的端到端TLS。作为参考,我在Kubernetes使用了Concur(通过hashicorp/concurHelm图表)。只有一个数据中心和Kubernetes群集-没有外部参与方或顾虑 我已将覆盖值.yaml文件配置为: 全球: 数据中心:沙箱 蛛网加密: 秘书长姓名:“领事” 秘密密钥:“领事\u八卦\u加密\u密钥” tls: 已启用:true httpsOnly:是的 enableAutoEncrypt:true serverAdditionalDNSSANs:[“'con
全球:
数据中心:沙箱
蛛网加密:
秘书长姓名:“领事”
秘密密钥:“领事\u八卦\u加密\u密钥”
tls:
已启用:true
httpsOnly:是的
enableAutoEncrypt:true
serverAdditionalDNSSANs:[“'consur.service.consul'”
服务器:
副本:3份
bootstrapExpect:3
储存量:20Gi
域名系统:
集群:172.20.53.53
用户界面:
服务:
类型:“负载平衡器”
同步目录:
已启用:true
所有其他值都是附带的文件中的默认值
这是可行的,而且Consour客户端日志表明所有代理都使用TLS进行了良好的连接,相关证书和密钥由(据我所知)Consour的功能创建
我不明白的是如何从Kubernetes上运行在Pod中的应用程序启动HTTPS连接到Consor服务器。由于Pod的容器的信任存储中没有(大概)领事根CA证书,因此所有HTTPS调用都会失败,如下例所示:
# Connect to Pod:
laptop$> kubectl exec -it my-pod sh
# Attempt valid HTTPS connection:
my-pod$> wget -q -O - https://consul.service.consul:8501
Connecting to consul.service.consul:8501 (10.110.1.131:8501)
ssl_client: consul.service.consul: certificate verification failed: unable to get local issuer certificate
wget: error getting response: Connection reset by peer
# Retry, but ignore certificate validity issues:
my-pod$> wget --no-check-certificate -q -O - https://consul.service.consul:8501/v1/status/leader
"10.110.1.131:8300"
如果容器无法识别证书是否有效,我应该如何从Kubernetes上的应用程序强制执行到Consor的端到端(已验证)HTTPS连接?
我对证书传播有什么误解吗
非常感谢-Aaron通过感谢Hashicorp的帮助解决了问题
- 使用名为concur\u GOSSIP\u ENCRYPTION\u key的密钥和适当的加密密钥值创建名为concur的Kubernetes秘密。
- 使用领事密钥生成值
- 安装带有值覆盖.yaml的hashicorp/CONSOR头盔图表,如下所示:
- 创建一个示例Pod规范来表示我们的应用程序。
- 确保它装载了领事服务器CA证书机密
- 确保Pod容器的主机IP作为环境变量公开
- 创建Pod后,
插入其中,并确保安装了ca证书和curl软件包(本例中我使用的是Alpine Linux)。kubectl exec
- (curl仅用于测试目的)
- 将装载的Concur server CA证书复制到/usr/local/share/CA certificates/中,并执行
将其添加到系统根CA存储中更新CA证书
- 领事服务器现在可以通过HTTPS访问(并受信任),如下所示:
- 出于性能原因,我们还希望通过HTTPS与Consor客户机(而不是服务器)交谈。
- 因为concur客户端有自己的CA证书,所以我们需要从服务器检索该证书
- 这需要concur-k8s二进制文件,因此我们需要得到它
- 获取领事客户端CA证书,并通过
安装:更新CA证书
- 领事客户端现在可以通过HTTPS访问(和信任),如下所示:
- 我们还可以从客户处获得Consour KV服务,而不会出现以下问题:
global:
datacenter: sandbox
gossipEncryption:
secretName: "consul"
secretKey: "CONSUL_GOSSIP_ENCRYPTION_KEY"
tls:
enabled: true
httpsOnly: true
enableAutoEncrypt: true
serverAdditionalDNSSANs: ["'consul.service.consul'"]
server:
replicas: 3
bootstrapExpect: 3
storage: 20Gi
dns:
clusterIP: 172.20.53.53
ui:
service:
type: 'LoadBalancer'
syncCatalog:
enabled: true
apiVersion: v1
kind: Pod
metadata:
namespace: default
name: test-pod
spec:
volumes:
- name: consul-consul-ca-cert
secret:
secretName: consul-consul-ca-cert
hostNetwork: false
containers:
- name: consul-test-pod
image: alpine
imagePullPolicy: IfNotPresent
env:
- name: HOST_IP
valueFrom:
fieldRef:
fieldPath: status.hostIP
command: ["/bin/sh"]
args: ["-c", "while true; do sleep 24h; done"]
volumeMounts:
- name: consul-consul-ca-cert
mountPath: /consul/tls/ca
#> apk update
#> apk add ca-certificates curl
#> cp /consul/tls/ca/tls.crt /usr/local/share/ca-certificates/consul-server-ca.crt
#> update-ca-certificates # might give a trivial warning - ignore it
#> curl https://consul.service.consul:8501/v1/status/leader
## No TLS errors ##
#> cd /usr/local/bin
#> wget https://releases.hashicorp.com/consul-k8s/0.15.0/consul-k8s_0.15.0_linux_amd64.zip # (or whatever latest version is)
#> unzip consul-k8s_0.15.0_linux_amd64.zip
#> rm consul-k8s_0.15.0_linux_amd64.zip
#> consul-k8s get-consul-client-ca -server-addr consul.service.consul -server-port 8501 -output-file /usr/local/share/ca-certificates/consul-client-ca.crt
#> update-ca-certificates # might give a trivial warning - ignore it
#> curl https://$HOST_IP:8501/v1/status/leader
## No TLS errors ##
#> curl https://$HOST_IP:8501/v1/kv/foo/bar/baz
## No TLS errors ##