Ssl Hashicorp领事-如何从Kubernetes集群中的POD执行已验证的TLS

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

我很难理解领事的端到端TLS。作为参考,我在Kubernetes使用了Concur(通过hashicorp/concurHelm图表)。只有一个数据中心和Kubernetes群集-没有外部参与方或顾虑

我已将覆盖值.yaml文件配置为:

全球:
数据中心:沙箱
蛛网加密:
秘书长姓名:“领事”
秘密密钥:“领事\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秘密。
    • 使用领事密钥生成值
  • 安装带有值覆盖.yamlhashicorp/CONSOR头盔图表,如下所示:
  • 创建一个示例Pod规范来表示我们的应用程序。
    • 确保它装载了领事服务器CA证书机密
    • 确保Pod容器的主机IP作为环境变量公开
  • 创建Pod后,
    kubectl exec
    插入其中,并确保安装了ca证书curl软件包(本例中我使用的是Alpine Linux)。
    • 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 ##