【问题标题】:How do I add an intermediate SSL certificate to Kubernetes ingress TLS configuration?如何将中间 SSL 证书添加到 Kubernetes 入口 TLS 配置?
【发布时间】:2017-08-21 11:32:53
【问题描述】:

文档没有说明如何添加中间 SSL 证书:https://kubernetes.io/docs/concepts/services-networking/ingress/#tls

我想下一步是阅读 Kubernetes 源代码。

【问题讨论】:

标签: kubernetes


【解决方案1】:

如果您在 Kubernetes TLS 入口配置中的 tls.cert 键中添加多个证书。请这样做

-----BEGIN CERTIFICATE-----
<put your certificate value in a single line >
-----END CERTIFICATE-----
-----BEGIN INTERMEDIATE CERTIFICATE-----
<put your certificate value in a single line>
-----END INTERMEDIATE CERTIFICATE-----

否则,您将在 ssl 证书链验证中遇到错误。

始终将主证书放在首位。

【讨论】:

  • 这不适用于谷歌云,仅使用 -----BEGIN CERTIFICATE----- 和 -----END CERTIFICATE----- 作为分隔符。也不需要将每个证书放在一行中。
  • 今天使用 GKE Ingress 和 K8s Secret 进行了测试。工作得很好。通过 SSLLabs 测试和验证ssllabs.com/ssltest
  • 我可以确认来自@4ndt3s 的评论,它仅适用于该分隔符。我简直不敢相信。
  • 可以确认这适用于在 GCP 上的 GKE 上运行的 nginx-ingress 控制器,并使用 @saran 描述的证书创建,然后将其作为机密加载到集群中
  • 我不认为这实际上存在-----BEGIN INTERMEDIATE CERTIFICATE----- 我现在已经用谷歌搜索了一段时间,并且可以找到除您之外的任何其他示例。最重要的是,它对我不起作用。当我在底部使用-----BEGIN CERTIFICATE----- 作为中间人时,它确实有效。
【解决方案2】:

它必须附加到证书值。就像nginx一样。

【讨论】:

  • 我创建了一个新的 .crt 文件并将我的 .crt 文件的内容放在顶部,然后我粘贴了我的 .ca-bundle 文件的内容。
  • 执行cat example_com.crt example_com.ca-bundle &gt; full_example_com.crt 之类的操作,然后将full_example_com.crt 文件传递​​给kubectl --cert 参数;)
  • 非常感谢,希望能尽快找到答案。
  • “同一个文件”是什么意思?而 nginx 又是怎样的呢?
  • 证书价值基本
【解决方案3】:

使用此命令创建证书

kubectl create secret generic tlscert_with_ca --from-file=tls.crt=your_cert.crt --from-file=tls.key=your_key.key --from-file=ca.crt=your_ca.crt

顺便说一句,your_ca.crt 也可以是中间证书

对我有用,nginx-inginx-controller 中的证书应该是这样的

-----BEGIN CERTIFICATE-----
your_cert
-----END CERTIFICATE-----

-----BEGIN RSA PRIVATE KEY-----
your_key
-----END RSA PRIVATE KEY-----

-----BEGIN CERTIFICATE-----
your_intermediate
-----END CERTIFICATE-----

参考official doc

【讨论】:

  • 这不是 kube secert TLS (kubernetes.io/tls) 而是类型:不透明
【解决方案4】:

中间 SSL 证书 (ca.intermediate.crt) 作为第二个证书包含在 k8s tls.crt 字段中。

tls.crt 包含三个由\n 分隔的文件:server.crtca.intermediate.crtca.crt

这是一个设置证书的 Ansible 任务:

- hosts: localhost
  connection: local
  vars:
     wildcard_foo_com_ssl_tls_crt:
       - "{{ lookup('file', './ssl_certs/star_foo_com/server.crt') }}"
       - "{{ lookup('file', './ssl_certs/star_foo_com/ca.intermediate.crt') }}"
       - "{{ lookup('file', './ssl_certs/star_foo_com/ca.crt') }}"
     wildcard_foo_com_ssl_tls_key: "{{ lookup('file', './ssl_certs/star_foo_com/server.key') }}"

  - name: Set up foo.com Certs
    k8s:
      state: present
      definition:
        apiVersion: v1
        kind: Secret
        metadata:
          name: name-com-wildcard-foo-com
          namespace: prod
        type: kubernetes.io/tls
        data:
          tls.crt: "{{ wildcard_foo_com_ssl_tls_crt | join('\n') | b64encode }}"
          tls.key: "{{ wildcard_foo_com_ssl_tls_key | b64encode }}"
          # ca.crt: this key seems to be ignored

【讨论】:

    【解决方案5】:

    Saran 提出的解决方案对我有用,但我必须在第二部分中删除“中间”

    -----BEGIN CERTIFICATE-----
    <put your certificate value in a single line >
    -----END CERTIFICATE-----
    -----BEGIN CERTIFICATE-----
    <put your **intermediate** certificate value in a single line>
    -----END CERTIFICATE-----
    

    遵循 Saran 的指示 => 始终将主证书放在首位。

    【讨论】:

      【解决方案6】:

      假设: 你有三个文件:

      • privkey.pem
      • root_cert.cer
      • interm_cert.cer
      1. openssl x509 -inform DER -in root_cert.cer -out root_cert.pem -outform PEM

      2. openssl x509 -inform DER -in interm_cert.cer -out interm_cert.pem -outform PEM

      如果命令 1 和 2 不起作用,证书文件可能已经是 pem 格式。在这种情况下,您可以跳过第 1 步和第 2 步。

      1. cat root_cert.pem interm_cert.pem &gt; full.pem

      2. kubectl create secret tls tls-ssl-ingress -n ingress --cert=/path/to/full.pem --key=/path/to/privkey.pem

      秘密(在步骤中称为 tls-ssl-ingress)名称应与 ingress 部署文件中指定的名称匹配。

      【讨论】:

        【解决方案7】:

        在您的 crt 文件中按以下顺序添加证书:

        -----BEGIN CERTIFICATE-----
        {Certificate issued to you}
        -----END CERTIFICATE-----
        -----BEGIN CERTIFICATE-----
        {Intermediate certificate}
        -----END CERTIFICATE-----
        -----BEGIN CERTIFICATE-----
        {Root certificate}
        -----END CERTIFICATE-----
        

        要立即应用更改,请重新启动 nginx 控制器(假设您正在使用此入口控制器):

        kubectl rollout restart deployment ingress-nginx-controller -n ingress-nginx
        

        【讨论】:

          猜你喜欢
          • 2020-09-05
          • 2021-07-29
          • 1970-01-01
          • 2019-03-13
          • 2020-05-30
          • 2020-01-17
          • 1970-01-01
          • 2016-08-21
          • 1970-01-01
          相关资源
          最近更新 更多