![](/img/trans.png)
[英]Kubernetes TLS Ingress route with cert-manager and SelfSigned ClusterIssuer not working
[英]How to setup TLS correctly in Kubernetes via cert-manager?
我正在尝试为 Kubernetes 集群 (AWS EKS) 之外可用的服务设置 TLS。 使用 cert-manager,我已经成功颁发了证书并配置了入口,但我仍然收到错误NET::ERR_CERT_AUTHORITY_INVALID
。 这是我所拥有的:
命名空间tests
和hello-kubernetes
在其中(部署和服务都具有名称hello-kubernetes-first
,服务是具有port
80 和targetPort
port
8080 的 ClusterIP,部署基于paulbouwer/hello-kubernetes:1.8
,请参阅我之前的问题中的详细信息)
DNS 和入口配置为显示服务:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-kubernetes-ingress namespace: tests spec: ingressClassName: nginx rules: - host: test3.projectname.org http: paths: - path: "/" pathType: Prefix backend: service: name: hello-kubernetes-first port: number: 80
如果不配置 TLS,我可以通过 http 访问 test3.projectname.org 并查看服务(好吧,它尝试将我重定向到 https,我看到NET::ERR_CERT_AUTHORITY_INVALID
,无论如何我都会进入不安全状态并查看 hello-kubernetes 页面)。
注意:我有 nginx-ingress入口控制器; 它是通过以下图表在我之前安装的:
apiVersion: v2 name: nginx description: A Helm chart for Kubernetes type: application version: 4.0.6 appVersion: "1.0.4" dependencies: - name: ingress-nginx version: 4.0.6 repository: https://kubernetes.github.io/ingress-nginx
和图表应用的值覆盖与原始值不同,主要在extraArgs
: default-ssl-certificate: "nginx-ingress/dragon-family-com"
is uncommneted
通过kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.5.4/cert-manager.yaml
安装的证书管理器
ClusterIssuer使用以下配置创建:
apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt-backoffice spec: acme: server: https://acme-staging-v02.api.letsencrypt.org/directory # use https://acme-v02.api.letsencrypt.org/directory after everything is fixed and works privateKeySecretRef: # this secret is created in the namespace of cert-manager name: letsencrypt-backoffice-private-key # email: <will be used for urgent alerts about expiration etc> solvers: # TODO: add for each domain/second-level domain/*.projectname.org - selector: dnsZones: - test.projectname.org - test2.projectname.org - test3.projectname.org http01: ingress: class: nginx
tests
命名空间中的证书。 它的配置是
apiVersion: cert-manager.io/v1 kind: Certificate metadata: name: letsencrypt-certificate-31 namespace: tests spec: secretName: tls-secret-31 issuerRef: kind: ClusterIssuer name: letsencrypt-backoffice commonName: test3.projectname.org dnsNames: - test3.projectname.org
现在,证书已准备就绪( kubectl get certificates -n tests
说明了这一点)并应用它,我将其添加到 ingress 的规范中:
tls:
- hosts:
- test3.projectname.org
secretName: tls-secret-31
但是,当我尝试通过 https 打开 test3.projectname.org 时,它仍然显示NET::ERR_CERT_AUTHORITY_INVALID
错误。 我究竟做错了什么? 如何调试这个? 我检查了openssl s_client -connect test3.projectname.org:443 -prexit
*并显示以下链:
0 s:CN = test3.projectname.org
i:C = US, O = (STAGING) Let's Encrypt, CN = (STAGING) Artificial Apricot R3
1 s:C = US, O = (STAGING) Let's Encrypt, CN = (STAGING) Artificial Apricot R3
i:C = US, O = (STAGING) Internet Security Research Group, CN = (STAGING) Pretend Pear X1
2 s:C = US, O = (STAGING) Internet Security Research Group, CN = (STAGING) Pretend Pear X1
i:C = US, O = (STAGING) Internet Security Research Group, CN = (STAGING) Doctored Durian Root CA X3
并告诉,除其他输出
验证错误:无法获取本地颁发者证书
不幸的是,我没有发现任何有用的东西可以进一步尝试,因此感谢您的帮助。
您的 ClusterIssuer 是指 LetsEncrypt 临时发行者。 删除该设置/默认应使用其生产设置。
按照 SYN 的建议,我已经解决了这个问题
将 ClusterIssuer 配置中的 ACME 服务器从https://acme-staging-v02.api.letsencrypt.org/directory
切换到https://acme-v02.api.letsencrypt.org/directory
。 临时服务器的想法似乎是:允许调试证书颁发(以便kubectl get certificate [-n <namespace>]
显示READY
= true
)而不提供实际的可信证书; 证书颁发完成后,必须切换到主服务器才能获得生产证书。
更新证书、tls 机密和入口配置。 好吧,我不确定是否有办法实际更新证书; 相反,我创建了新的,它创建了新的秘密,然后更新了入口配置(只是秘密的名称)
您的证书不起作用的原因,不是因为您使用了登台服务器,而是因为您没有在 Ingress 规则中指定tls对象。 Certbot 的暂存仅用于测试目的,并且如果您每小时请求超过 5 个证书,则不会在您测试时“禁止”您。 当您确认一切都按预期工作时,您可以使用普通的非登台服务器。
应该这样做:
集群发行者对象:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: user@example.com
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
入口对象:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: hello-kubernetes-ingress
namespace: tests
labels:
app: hello-kubernetes-ingress
annotations:
kubernetes.io/ingress.class: "nginx"
cert-manager.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- test3.projectname.org
secretName: hello-tls
rules:
- host: test3.projectname.org
http:
paths:
- pathType: ImplementationSpecific
path: "/"
backend:
service:
name: hello-kubernetes-ingress
port:
number: 80
证书和密钥存储在名为“hello-tls”的机密中,您在初始示例中也没有指定该机密,因此您收到了失败。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.