【问题标题】:SSL certificate for Kubernetes IngressKubernetes Ingress 的 SSL 证书
【发布时间】:2020-08-19 11:01:01
【问题描述】:

我想在 Google Kubernetes Engine 上为我的微服务基础设施创建一个 HTTPS 入口,用于我的 test 环境。基本 HTTP 入口工作正常,现在我想创建一个安全的入口。我没有域,我希望我的 UI 直接在 Ingress IP 上通过 https 发出请求。

我使用 Let's Encrypt(sslforfree 网站)为我可以访问的 IP 创建了证书。但是我在证书中用于域名的这个 ip 不是创建 Ingress 的 IP。现在所有请求都返回 401,我不知道为什么。浏览器返回的第一个错误如下:

Websites prove their identity via certificates. Firefox does not trust this site because it uses a certificate that is not valid for 35.241.60.223. The certificate is only valid for 35.228.159.214.
 
Error code: SEC_ERROR_UNKNOWN_ISSUER

这就是问题所在:如果我想在 GKE 上、HTTPS 上创建一个 Ingress,我需要一个证书。但在我知道 Ingress IP 之前,我无法获得证书。

我在 HTTPS 和 Ingress 方面没有太多经验,我不知道在我的测试环境中拥有 HTTP Ingress 的最简单方法是什么,而无需任何域名。

编辑:我创建了一个域 comanddev.tk 并将其转发到入口 url 位置。我为 comanddev.tk 创建了一个证书,并更新了入口以使用该证书。现在请求得到 ERR_TIMEDOUT,我在 Ingress Controller 的使用日志中看不到任何内容,除了 GET https://35.241.60.223/customer-service/actuator/health 401

【问题讨论】:

  • 当您使用 GKE 时,您想使用GCP Ingress 还是Nginx Ingress?这个解决方案对你有用吗Using Google-managed SSL certificates。您可以保留全球 IP 地址。
  • 我正在使用 GKE,我想要一个 GCP Ingress
  • 您最初的问题是如何创建 SSL 证书并得到了解答。第二个问题应作为不同的问题单独创建。

标签: kubernetes https google-kubernetes-engine kubernetes-ingress


【解决方案1】:

据我所知,您不能将 Let's Encrypt 用于仅用于 IP 地址的证书。您需要一个域名,因为证书用于“证明”您对该域的所有权或控制权。 见https://community.letsencrypt.org/t/certificate-for-public-ip-without-domain-name/6082/14 您的选择是使用自签名 SSL 证书或注册某种廉价(子)域用于测试目的,然后您可以指向入口 IP。

【讨论】:

  • 所以我得到一个域,为那个域创建一个证书。之后,我使用该证书创建入口,将 URL 从域重定向到入口 url,这应该可以吗?
  • 这取决于您如何创建证书和入口。你从哪里获得letsencrypt证书?你在 kubernetes 中使用证书管理器吗?然后看看另一个答案,入口必须配置为使用letsencrypt。但是为了让这个工作你的域名必须已经指向入口 IP。否则,这取决于您使用的入口以及如何将证书插入入口。通常通过 Kubernetes Secrets 或类似的方式。
  • 我这样做了,请求 comanddev.tk/business-owner-service/actuator/health 返回 SEC_ERROR_UNKNOWN_ISSUER
  • 此响应仅在 Firefox 上,在 Chrome 上我得到 ERR_TIMED_OUT
【解决方案2】:

这可能是由于您拥有的 ClusterIssuer/Issuer + Ingress 配置所致。 请按照以下步骤进行正确的配置:

   apiVersion: cert-manager.io/v1alpha2
   kind: Issuer
   metadata:
     name: letsencrypt-prod
   spec:
     acme:
       # The ACME server URL
       server: https://acme-v02.api.letsencrypt.org/directory
       # Email address used for ACME registration
       email: user@example.com
       # Name of a secret used to store the ACME account private key
       privateKeySecretRef:
         name: letsencrypt-prod
       # Enable the HTTP-01 challenge provider
       solvers:
       - http01:
           ingress:
             class: nginx
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kuard
  annotations:
    kubernetes.io/ingress.class: "nginx"    
    cert-manager.io/issuer: "letsencrypt-prod"

spec:
  tls:
  - hosts:
    - example.example.com (you probably have an DNS default)
    secretName: quickstart-example-tls
  rules:
  - host: example.example.com
    http:
      paths:
      - path: /
        backend:
          serviceName: kuard
          servicePort: 80

来源: https://docs.cert-manager.io/en/release-0.11/tutorials/acme/quick-start/index.html?highlight=lets#step-6-configure-let-s-encrypt-issuer

【讨论】:

  • 我正在使用自己的容器(基本上是 SpringBoot 应用程序)。这是什么 ingress.class?我不认为是 nginx
【解决方案3】:

回到最初的问题。如果您只是在测试,则不一定要获得 DNS 服务器才能从 LetsEncrypt 获得证书。您可以使用nip.ioxip.io 等服务将您的IP 地址转换为DNS 名称并无需任何设置即可解析。您可以使用 https01 质询通过 LetsEncrypt 解决。 cert-manager 将为您简化设置。

ERR_TIMEDOUT 很可能是网络问题。如果你点击它,你会从入口控制器得到一些响应。确保您的入口控制器已启动并正在运行,如果它正在查看集群前面的网络设备。

参考:

  1. https://nip.io/
  2. https://cert-manager.io/docs/installation/kubernetes/#installing-with-regular-manifests
  3. https://cert-manager.io/docs/tutorials/acme/ingress/#step-6-configure-let-s-encrypt-issuer

【讨论】:

    猜你喜欢
    • 2020-06-26
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    相关资源
    最近更新 更多