【问题标题】:Google Managed SSL Certificate use SSL v3Google 托管 SSL 证书使用 SSL v3
【发布时间】:2022-07-01 00:08:08
【问题描述】:

我想在 GKE 上使用 Google 托管证书。

我有一个 GKE 集群 (1.22),并针对 CloudDNS 区域配置了 external-dns helm 图表,然后我尝试了:

$ gcloud compute ssl-certificates create managed-cert \
    --description "managed-cert" \
    --domains "<hostname>" \
    --global

$ kubectl create ns test

$ cat <<EOF | kubectl apply -f -
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-mc-deployment
  namespace: test
spec:
  selector:
    matchLabels:
      app: products
      department: sales
  replicas: 2
  template:
    metadata:
      labels:
        app: products
        department: sales
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"
        env:
        - name: "PORT"
          value: "50001"

---
apiVersion: v1
kind: Service
metadata:
  name: my-mc-service
  namespace: test
spec:
  type: NodePort
  selector:
    app: products
    department: sales
  ports:
  - name: my-first-port
    protocol: TCP
    port: 60001
    targetPort: 50001

---
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
  name: managed-cert
  namespace: test
spec:
  domains:
    - <hostname>

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-psc-ingress
  namespace: test
  annotations:
    networking.gke.io/managed-certificates: "managed-cert"
    ingress.gcp.kubernetes.io/pre-shared-cert: "managed-cert"
    kubernetes.io/ingress.class: "gce"
spec:
  rules:
  - host: "<hostname>"
    http:
      paths:
      - path: "/"
        pathType: "ImplementationSpecific"
        backend:
          service:
            name: "my-mc-service"
            port:
              number: 60001
EOF

DNS 区域已正确更新,我可以浏览 http://&lt;hostname&gt;

如果我:

$ curl -v https://<hostname>
*   Trying 34.120.218.42:443...
* Connected to <hostname> (34.120.218.42) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
*  CAfile: /etc/pki/tls/certs/ca-bundle.crt
*  CApath: none
* TLSv1.0 (OUT), TLS header, Certificate Status (22):
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.0 (IN), TLS header, Unknown (21):
* TLSv1.3 (IN), TLS alert, handshake failure (552):
* error:0A000410:SSL routines::sslv3 alert handshake failure
* Closing connection 0
curl: (35) error:0A000410:SSL routines::sslv3 alert handshake failure

$ gcloud compute ssl-certificates list 
NAME                                       TYPE     CREATION_TIMESTAMP             EXPIRE_TIME  MANAGED_STATUS
managed-cert                               MANAGED  2022-06-30T00:27:25.708-07:00               PROVISIONING
    <hostname>: PROVISIONING
mcrt-fe44e023-3234-42cc-b009-67f57dcdc5ef  MANAGED  2022-06-30T00:27:52.707-07:00               PROVISIONING
    <hostname>: PROVISIONING

即使我指定了它,我也不明白它为什么要创建新的托管证书 (mcrt-fe44e023-3234-42cc-b009-67f57dcdc5ef)。

有什么想法吗?

谢谢

【问题讨论】:

  • 我没有看到任何使用 SSLv3 的指标。客户端尝试 TLS 但由于未知原因失败并因此发送警报。检查服务器的 TLS 版本,例如使用ssllabs.com/ssltest 或本地testssl.sh
  • 在上述 Ingress Yaml 文件的注释中,您列出了两个证书,分别是托管证书和预共享证书。因此,在输出中我们可以看到两个 SSL 证书。有关specifying certificates for Ingress的更多信息,请参阅链接
  • 是的,但我指向的是同一个托管证书。如果我删除 `ingress.gcp.kubernetes.io/pre-shared-cert: "managed-cert"` 会创建另一个托管证书 (mcrt-XXX)

标签: google-cloud-platform https ssl-certificate certificate google-kubernetes-engine


【解决方案1】:

经过一些实验,我明白发生了什么。

以上代码有效,创建和传播证书大约需要 20 分钟。

关于双重证书:不需要创建ssl-certificates 对象,因为ManagedCertificate 自定义资源将为您创建它(mcrt-*)。

回顾一个例子:

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-mc-deployment
  namespace: test
spec:
  selector:
    matchLabels:
      app: products
      department: sales
  replicas: 2
  template:
    metadata:
      labels:
        app: products
        department: sales
    spec:
      containers:
      - name: hello
        image: "gcr.io/google-samples/hello-app:2.0"
        env:
        - name: "PORT"
          value: "50001"

---
apiVersion: v1
kind: Service
metadata:
  name: my-mc-service
  namespace: test
spec:
  type: NodePort
  selector:
    app: products
    department: sales
  ports:
  - name: my-first-port
    protocol: TCP
    port: 60001
    targetPort: 50001

---
apiVersion: networking.gke.io/v1
kind: ManagedCertificate
metadata:
  name: managed-cert
  namespace: test
spec:
  domains:
    - <hostname>

---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-psc-ingress
  namespace: test
  annotations:
    networking.gke.io/managed-certificates: "managed-cert"
    kubernetes.io/ingress.class: "gce"
spec:
  rules:
  - host: "<hostname>"
    http:
      paths:
      - path: "/"
        pathType: "ImplementationSpecific"
        backend:
          service:
            name: "my-mc-service"
            port:
              number: 60001

【讨论】:

    猜你喜欢
    • 2014-09-09
    • 2019-07-21
    • 2019-11-22
    • 2019-10-04
    • 2020-08-04
    • 1970-01-01
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多