为啥 GCP LoadBalancer 不支持 ECDSA 证书?

Posted

技术标签:

【中文标题】为啥 GCP LoadBalancer 不支持 ECDSA 证书?【英文标题】:Why GCP LoadBalancer doesn't support the ECDSA certificate?为什么 GCP LoadBalancer 不支持 ECDSA 证书? 【发布时间】:2022-01-13 09:46:08 【问题描述】:

我已经在 Google Cloud Platform 上使用前端配置和 ECDSA P-384 TLS 证书创建了 kubernetes 入口,创建过程几秒钟后,我收到了以下错误:

同步到 GCP 时出错:运行负载平衡器同步例程时出错: 负载均衡器 -default--ingress-****** 不存在: 证书创建失败 - k8s2-cr---***** 错误:googleapi: 错误 400:不支持 ECDSA 曲线。, sslCertificateUnsupportedCurve

为什么不支持 ECDSA 曲线?有什么方法可以启用这种支持吗?

创建 tls-secret 命令:

kubectl create secret tls tls --key [key-path] --cert [cert-path]

前端配置:

apiVersion: networking.gke.io/v1beta1
kind: FrontendConfig
metadata:
  name: frontend-config
spec:
  redirectToHttps:
  enabled: true
  responseCodeName: MOVED_PERMANENTLY_DEFAULT

入口:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress
  namespace: default
  labels:
    kind: ingress
  annotations:
    networking.gke.io/v1beta1.FrontendConfig: frontend-config
spec:
  tls:
  - hosts:
    - '*.mydomain.com'
    secretName: tls
  rules:
  - host: mydomain.com
    http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: spa-ingress-service
            port:
              number: 80
  - host: api.mydomain.com
    http:
      paths:
      - path: /*
        pathType: ImplementationSpecific
        backend:
          service:
            name: api-ingress-service
            port:
              number: 80

水疗服务:

# SERVICE LOAD BALANCER
apiVersion: v1
kind: Service
metadata:
  name: spa-service
  labels:
    app/name: spa
spec:
  type: LoadBalancer
  selector:
    app/template: spa
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: http
---
# SERVICE NODE PORT - FOR INGRESS
apiVersion: v1
kind: Service
metadata:
  name: spa-ingress-service
  labels:
    app/name: ingress.spa
spec:
  type: NodePort
  selector:
    app/template: spa
  ports:
  - name: https
    protocol: TCP
    port: 80
    targetPort: http

API 服务:

# SERVICE LOAD BALANCER
apiVersion: v1
kind: Service
metadata:
  name: api-service
  labels:
    app/name: api
spec:
  type: LoadBalancer
  selector:
    app/template: api
  ports:
  - name: http
    protocol: TCP
    port: 80
    targetPort: http
---
# SERVICE NODE PORT - FOR INGRESS
apiVersion: v1
kind: Service
metadata:
  name: api-ingress-service
  labels:
    app/name: ingress.api
spec:
  type: NodePort
  selector:
    app/template: api
  ports:
  - name: https
    protocol: TCP
    port: 80
    targetPort: http

kubectl 描述入口响应:

【问题讨论】:

能否尝试将证书更改为P-256。我认为以下错误是由于与当前使用的P-384证书不兼容所致。 是的,如果我将 SHA-256 与 RSA 加密证书一起使用,它就可以工作。您是否认为这是一个 SHA 位问题而不是 ECDSA? @BakulMitra ECDSA P-384 与我所说的不兼容。但是如果你使用 SHA-256,问题就解决了。 【参考方案1】:

gcp load balancer 支持 RSA-2048 或 ECDSA P-256 证书。 DownstreamTlsContexts 还支持多个 TLS 证书。这些可能是 RSA 和 P-256 ECDSA 证书的混合。

以下错误是由于与当前使用的 P-384 证书而不是 P-256 证书不兼容。

有关更多信息,请参阅Load Balancing Overview。

【讨论】:

以上是关于为啥 GCP LoadBalancer 不支持 ECDSA 证书?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 GCP 存储桶上的新文件不发送 pubsub 消息?

terraform GCP https) 负载均衡器

如何设定 GCP HTTP(S) 负载平衡器

K8S---service---metalLB

Dataflow SQL (GCP) 不支持使用 STRUCT 的嵌套行

GCP 计算实例上的部署失败,为啥从 Gitlab 推送更改