Kubernates Ingress 配置证书

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Kubernates Ingress 配置证书相关的知识,希望对你有一定的参考价值。

参考技术A 关于双向认证的一些概念可以在这篇文章中获取 https://www.jianshu.com/p/e1aaa5e9de17

在K8S中,密钥的管理是通过创建Secret方式进行的,我们生成一对公私钥,并且公钥已经通过CA签发一张证书之后,就可以导入到K8S的Secret了。通常,我们会有下面三个文件:

nginx Ingress Controller 文档中提供了两种方式的公私钥导入

这是第一种导入方式,其实跟我们在Nginx中配置证书并无太大差异,单独导入ca.pem作为一个secret,然后打包cert.pem和key.pem作为一个secret,命令如下:

第二种方式则是将证书,证书链和私钥全部打包在一块,参考命令如下,

创建完毕之后我们看一下我们创建好的Secret:

创建完Secret之后就可以配置Ingress了。根据官方的样例,我们调整参数,如下:

配置完之后我们可以进入nginx-ingress-controller容器,在nginx.conf文件下看到这样三个配置,ingress自动帮我们配置好了nginx:

这样子直接就可以使用HTTPs访问了,Ingress会校验证书的合法性。

我们使用的是自签名证书给客户端签发客户端证书,在客户端带上证书访问的时候,出现了400 Bad Certificate错误,如果确认应用层证书配置和信任链配置无误的情况下,可以检查下这个配置

我们使用的自签名证书链有4层,然后我将nginx.ingress.kubernetes.io/auth-tls-verify-depth校验链层数改为4,问题解决了。

为啥我的 kubernetes 证书仍然在浏览器中显示 DNS Name=ingress.local?

【中文标题】为啥我的 kubernetes 证书仍然在浏览器中显示 DNS Name=ingress.local?【英文标题】:why does my kubernetes certificate still show DNS Name=ingress.local in the browser?为什么我的 kubernetes 证书仍然在浏览器中显示 DNS Name=ingress.local? 【发布时间】:2021-12-20 23:04:59 【问题描述】:

我正在使用 helm 安装 gitlab,我已经使用以下命令在 kubernetes 中创建了证书。

但是,当我运行 helm install 并在浏览器中输入地址 (ip-address.nip.io) 时,我仍然收到“您的连接不是私人的”消息。我已将证书安装到我的受信任的根证书颁发机构。

当我从浏览器检查证书详细信息时,我发现它仍然显示 Subject Alternative Name -> DNS Name=ingress.local

我无法从浏览器获取我的 ip-address.nip.io 端点,这就是目标。

K8s 证书

cat <<EOF | cfssl genkey - | cfssljson -bare server

  "hosts": [
    "<ip-address>.nip.io",
    "registry.<ip-address>.nip.io",
    "gitlab.<ip-address>.nip.io",
    "minio.<ip-address>.nip.io"
  ],
  "CN": "<ip-address>.nip.io",
  "key": 
    "algo": "rsa",
    "size": 2048
  

EOF
cat <<EOF | kubectl apply -f -
apiVersion: certificates.k8s.io/v1beta1
kind: CertificateSigningRequest
metadata:
  name: <ip-address>.nip.io
spec:
  request: $(cat server.csr | base64 | tr -d '\n')
  usages:
  - digital signature
  - key encipherment
  - server auth
EOF

kubectl certificate approve <ip-address>.nip.io

kubectl get csr <ip-address>.nip.io -o jsonpath='.status.certificate' | base64 --decode > server.crt

kubectl create secret tls <secret-name> --key server-key.pem --cert server.crt

【问题讨论】:

I have created the certificate in kubernetes with the below commands ...您忘记包含命令了。 如果它解决了您的问题,请考虑接受答案。***.com/help/accepted-answer 【参考方案1】:

检查您的入口 hosts 配置和 secrets 是否正确设置

spec:
  tls:
  - secretName: cert-secret
    hosts:
    - app.dev.example.com    <---- this entry should match below
  - secretName: dev-wildcard-tls-cert
    hosts:
    - "*.app.example.com"    <---- this entry should match below

  rules:
  - host: app.dev.example.com   <---- this entry should match
    http:
      paths:
      - path: /
        backend:
          serviceName: service-2
          servicePort: 80
  - host: "*.app.example.com"   <---- this entry should match
    http:
      paths:
      - path: /
        backend:
          serviceName: service-1
          servicePort: 80

【讨论】:

以上是关于Kubernates Ingress 配置证书的主要内容,如果未能解决你的问题,请参考以下文章

kubernates入门

配置tls ingress证书

kubernetes ingress: traefik: 多域名及证书配置

traefik Ingress https配置

k8s Nginx-ingress配置https

Kubernetes Ingress-Controller 和 AWS API Gateway 客户端证书