我已设置 cert-manager 来与私有 ca 颁发者签署证书。私有 CA 机密已正确设置,在添加到 TLS 机密之前,我已使用 OpenSSL 验证命令验证了链,并且它们都正确验证了根。但是,当使用 cert-manager 执行相同操作时,证书未签名,并且出现错误“消息:证书请求无法完成,将重试:签名证书错误:证书链格式错误或损坏”
这是证书颁发者的 yaml
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: my-ca-issuer
namespace: default
spec:
ca:
secretName: my-tls-secret
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: cert-test
namespace: default
spec:
secretName: my-tls-secret
issuerRef:
name: my-ca-issuer
kind: ClusterIssuer
commonName: cert-test.com
renewBefore: 12h # Renew the certificate when it's 12 hours from expiration
my-tls-secret 位于 cert-manager 命名空间中
ca 发行人验证正确
kubectl get clusterissuers -o wide
NAME READY STATUS AGE
my-ca-issuer True Signing CA verified 27h
my-tls 秘密是使用此命令创建的
kubectl create secret generic my-tls-secret --from-file=tls.crt=cert-chain.pem --from-file=tls.key=myca.key --from-file=ca.crt=ca-chain.pem -n cert-manager
关于为什么 cert-manager 链格式错误而 openssl verify 链没有任何问题的任何线索
openssl crl2pkcs7 -nocrl -certfile ca-chain.pem | openssl pkcs7 -print_certs -noout
subject=C = US, ST = TX, L = Austin, O = org, CN = app-TLS-Sub-CA
issuer=C = US, ST = TX, L = Austin, O = org, CN = Issuing-Sub-CA
subject=C = US, ST = TX, L = Austin, O = org, CN = Issuing-Sub-CA
issuer=C = US, ST = TX, L = Austin, O = org, CN = Root
subject=C = US, ST = TX, L = Austin, O = org, CN = Root
issuer=C = US, ST = TX, L = Austin, O = org, CN = Root
根据您的评论,即使在确保证书的正确顺序和串联之后,问题仍然存在。
虽然 OpenSSL 能够验证链,但
cert-manager
在 Kubernetes 上下文中可能会以不同的方式解释它。这可能是由于cert-manager
处理证书解析的方式所致。考虑使用诸如和资源之类的工具来获取更多线索。
kubectl describe
Certificate
CertificateRequest
有时,证书文件可能包含隐藏字符或不易察觉的格式问题。确保 PEM 文件不包含任何无关字符或不正确的行结尾。您可以使用诸如
cat -v
或具有隐藏字符可见性的文本编辑器之类的工具来检查文件。确保 代表的 CA
my-tls-secret
具有签署证书所需的权限。某些 CA 可能仅限于签署某些类型或级别的证书。这是特别相关的,因为您的 CA 层次结构中有多个级别。增加日志详细程度
cert-manager
以获取有关签名过程中发生的情况的更多详细信息。以防万一,您的证书链的深度可能会导致问题。虽然不常见,但某些系统对其可处理的链深度有限制。如果可能,请使用更简单的链(更少的级别)进行测试,看看问题是否仍然存在。
看来问题可能与 my-tls-secret 密钥中证书链的格式或内容有关。您应该确保 tls.crt 中的链顺序正确并包含所有必要的中间证书。
尝试以正确的顺序连接证书:首先是叶证书,然后是中间证书(如果有),最后是根证书。然后使用正确排序的链更新 my-tls-secret。
像这样:
然后合并证书:
让我知道事情进展如何!