AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1148596
Accepted
appcoder
appcoder
Asked: 2023-11-23 10:01:25 +0800 CST2023-11-23 10:01:25 +0800 CST 2023-11-23 10:01:25 +0800 CST

kubernetes cert-manager 因证书链格式错误或损坏而失败

  • 772
这个问题是从 Stack Overflow 迁移过来的,因为它可以在服务器故障上得到回答。昨天迁移了 。

我已设置 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
kubernetes
  • 2 2 个回答
  • 25 Views

2 个回答

  • Voted
  1. Best Answer
    VonC
    2023-11-26T08:21:59+08:002023-11-26T08:21:59+08:00

    根据您的评论,即使在确保证书的正确顺序和串联之后,问题仍然存在。

    [ Kubernetes Cluster ]
             |
       [ cert-manager ]
             | \
             |  [ Increased Log Verbosity ]
             |
    [ my-ca-issuer ClusterIssuer ]
             | \
             |  [ Check CA Permissions ]
             |
    [ my-tls-secret (CA secret) ]
             | \
             |  [ Verify Certificate Chain Formatting ]
             |
    [ cert-test Certificate ]
             |
       [ CertificateRequest Debugging ]
    

    虽然 OpenSSL 能够验证链,但cert-manager在 Kubernetes 上下文中可能会以不同的方式解释它。这可能是由于cert-manager处理证书解析的方式所致。考虑使用诸如和资源
    之类的工具来获取更多线索。kubectl describeCertificateCertificateRequest

    kubectl describe certificate cert-name -n default
    kubectl describe certificaterequest -n default
    kubectl describe clusterissuer my-ca-issuer
    

    有时,证书文件可能包含隐藏字符或不易察觉的格式问题。确保 PEM 文件不包含任何无关字符或不正确的行结尾。您可以使用诸如cat -v或具有隐藏字符可见性的文本编辑器之类的工具来检查文件。

    确保 代表的 CAmy-tls-secret具有签署证书所需的权限。某些 CA 可能仅限于签署某些类型或级别的证书。这是特别相关的,因为您的 CA 层次结构中有多个级别。

    增加日志详细程度cert-manager以获取有关签名过程中发生的情况的更多详细信息。

    kubectl get deployments -n cert-manager
    kubectl edit deployment <cert-manager-deployment-name> -n cert-manager
    
    spec:
      containers:
      - args:
        - --v=4  # This sets log verbosity to level 4
        ...
    

    以防万一,您的证书链的深度可能会导致问题。虽然不常见,但某些系统对其可处理的链深度有限制。如果可能,请使用更简单的链(更少的级别)进行测试,看看问题是否仍然存在。

    • 3
  2. Gabriel Ramuglia
    2023-11-25T15:30:54+08:002023-11-25T15:30:54+08:00

    看来问题可能与 my-tls-secret 密钥中证书链的格式或内容有关。您应该确保 tls.crt 中的链顺序正确并包含所有必要的中间证书。

    尝试以正确的顺序连接证书:首先是叶证书,然后是中间证书(如果有),最后是根证书。然后使用正确排序的链更新 my-tls-secret。

    像这样:

    kubectl create secret generic my-tls-secret --from-file=tls.crt=combined-chain.pem --from-file=tls.key=myca.key --namespace=cert-manager
    

    然后合并证书:

    cat leaf-cert.pem intermediate-cert.pem root-cert.pem > combined-chain.pem
    

    让我知道事情进展如何!

    • 0

相关问题

  • Nvidia Config 后 Containerd 无法启动

  • 在使用 kubeadm 引导集群之前,如何修改 CoreDNS 配置映射?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve