cert-manager:没有配置的挑战解决程序可以用于此挑战

use*_*406 5 kubernetes lets-encrypt cert-manager amazon-eks

我按照此说明在我的 EKS 集群https://cert-manager.io/docs/tutorials/acme/ingress/上设置了一个证书管理器。

这是我的入口

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: test
  annotations:
    kubernetes.io/ingress.class: "nginx"
    cert-manager.io/issuer: "letsencrypt-staging"
spec:
  tls:
  - hosts:
      - '*.test.com'
    secretName: test-tls
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: test-service
                port:
                  number: 80
Run Code Online (Sandbox Code Playgroud)

这里是发行人。我刚刚从说明中复制了配置

apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-staging
spec:
  acme:
    server: https://acme-staging-v02.api.letsencrypt.org/directory
    email: info@test.com
    privateKeySecretRef:
      name: letsencrypt-staging
    solvers:
      - http01:
          ingress:
            class: nginx
Run Code Online (Sandbox Code Playgroud)

部署后发现证书就绪状态为false

kubectl get certificate
NAME          READY   SECRET        AGE
test-tls   False   test-tls   2m45s
Run Code Online (Sandbox Code Playgroud)

然后我按照此进行故障排除https://cert-manager.io/docs/faq/troubleshooting/

我跑了kubectl describe certificaterequest <request name>,发现错误Waiting on certificate issuance from order test-tls-xxx: "pending"

然后运行kubectl describe order test-tls-xxx,发现错误 Warning Solver 20m cert-manager Failed to determine a valid solver configuration for the set of domains on the Order: no configured challenge solvers can be used for this challenge

知道为什么它无法确定有效的求解器吗?如何测试求解器是否正常工作?

Har*_*var 6

cluster issuer由于您正在使用暂存 URL 来验证图像,因此它不起作用。

请尝试使用生产 URL。

这是 Clusterissuer 和 ingress YAML 的简单且正确的示例(请注意,您正在尝试使用 staging API https://acme-staging-v02.api.letsencrypt.org/directory如果可能,请使用生产服务器地址,以便它可以与所有浏览器)

例子:

apiVersion: cert-manager.io/v1alpha2
kind: ClusterIssuer
metadata:
  name: cluster-issuer-name
  namespace: development
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: harsh@example.com
    privateKeySecretRef:
      name: secret-name
    solvers:
    - http01:
        ingress:
          class: nginx-class-name
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    kubernetes.io/ingress.class: nginx-class-name
    cert-manager.io/cluster-issuer: cluster-issuer-name
    nginx.ingress.kubernetes.io/rewrite-target: /
  name: example-ingress
spec:
  rules:
  - host: sub.example.com
    http:
      paths:
      - path: /api
        backend:
          serviceName: service-name
          servicePort: 80
  tls:
  - hosts:
    - sub.example.com
    secretName: secret-name
Run Code Online (Sandbox Code Playgroud)

注意:当您再次尝试时,请先尝试删除旧对象,例如 ingress、Clusterissuer。

发行者与集群发行者

颁发者是命名空间资源,不可能从不同命名空间中的颁发者颁发证书。这意味着您需要在您希望获取证书的每个命名空间中创建一个颁发者。

如果要创建可在多个命名空间中使用的单个 Issuer,则应考虑创建 ClusterIssuer 资源。这与颁发者资源几乎相同,但它是非命名空间的,因此可用于跨所有命名空间颁发证书。

参考: https: //cert-manager.io/docs/concepts/issuer/

通配符证书

您可以根据要求使用,如果您使用的是发行者,您可以更新入口 注释行,例如

cert-manager.io/issuer: issuer-name
Run Code Online (Sandbox Code Playgroud)

如果您尝试获取通配符 *证书,您将无法使用HTTP 身份验证方法获取它

solvers:
        - http01:
            ingress:
              class: nginx-class-name
Run Code Online (Sandbox Code Playgroud)

相反,您必须使用通配符证书的DNS 身份验证方法。

solvers:
    - dns01:
        cloudDNS:
          project: my-project
          serviceAccountSecretRef:
            name: prod-clouddns-svc-acct-secret
            key: service-account.json
Run Code Online (Sandbox Code Playgroud)

了解更多信息: https: //cert-manager.io/docs/configuration/acme/dns01/

参考文章获取通配符证书:https://medium.com/@harsh.manvar111/wild-card-certificate-using-cert-manager-in-kubernetes-3406b042d5a2