You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCP负载均衡器强制mTLS后无法访问后端MIG实例的求助

GCP负载均衡器配置双向TLS(mTLS)遇400错误问题

我部署了GCP负载均衡器,将请求代理至后端托管实例组(MIG)的虚拟机,这些虚拟机运行带有Nginx代理的Docker容器,最终转发请求到Java应用。初始阶段禁用了TLS,现在上线生产环境必须启用双向TLS(mTLS)。仅启用TLS时测试正常,但强制mTLS后出现400错误,提示"No required SSL certificate was sent",看起来GCP负载均衡器未识别客户端根CA证书。我已创建并关联SSL策略,且在目标代理上上传了服务器证书和私钥,请问如何让负载均衡器知晓客户端根CA证书?尝试添加请求头,无效果。


测试命令及返回结果

执行命令:

curl -v --cert client_auth_webserver.crt --key client_auth_webserver.key https://test.mytest.com/v1/licenseInfo

返回输出:

*   Trying 35.201.71.87:443...
* Connected to test.mytest.com (35.201.71.87) port 443 (#0)
* ALPN: offers h2,http/1.1
* (304) (OUT), TLS handshake, Client hello (1):
*  CAfile: /etc/ssl/cert.pem
*  CApath: none
* (304) (IN), TLS handshake, Server hello (2):
* (304) (IN), TLS handshake, Unknown (8):
* (304) (IN), TLS handshake, Certificate (11):
* (304) (IN), TLS handshake, CERT verify (15):
* (304) (IN), TLS handshake, Finished (20):
* (304) (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / AEAD-CHACHA20-POLY1305-SHA256
* ALPN: server accepted h2
* Server certificate:
*  subject: CN=test.mytest.com
*  start date: May 28 05:44:13 2024 GMT
*  expire date: Aug 26 05:44:12 2024 GMT
*  subjectAltName: host "test.mytest.com" matched cert's "test.mytest.com"
*  issuer: C=US; O=Let's Encrypt; CN=R3
*  SSL certificate verify ok.
* using HTTP/2
* h2 [:method: GET]
* h2 [:scheme: https]
* h2 [:authority: test.myest.com]
* h2 [:path: /v1/licenseInfo]
* h2 [user-agent: curl/8.1.2]
* h2 [accept: */*]
* Using Stream ID: 1 (easy handle 0x15380a800)
> GET /v1/licenseInfo HTTP/2
> Host: us-deployment-test.cloudshsm.com
> User-Agent: curl/8.1.2
> Accept: */*
>
< HTTP/2 400
< server: nginx/1.25.5
< date: Wed, 29 May 2024 08:03:24 GMT
< content-type: text/html
< content-length: 237
< strict-transport-security: max-age=31536000; includeSubDomains
< via: 1.1 google
< alt-svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000
<
<html>
<head><title>400 No required SSL certificate was sent</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>No required SSL certificate was sent</center>
<hr><center>nginx/1.25.5</center>
</body>
</html>
* Connection #0 to host test.mytest.com left intact

解决方案

GCP负载均衡器实现mTLS需要在目标HTTPS代理中配置客户端CA证书池,而非仅依赖SSL策略。具体操作步骤:

  • 创建客户端CA证书池:将用于验证客户端证书的根CA证书(PEM格式)上传至GCP证书管理服务,创建客户端CA证书池。确保证书包含完整的根CA链(如有必要的中间证书)。
  • 更新目标HTTPS代理:编辑现有目标HTTPS代理,关联刚创建的客户端CA证书池。同时确认SSL策略中clientCertificateConfig设置为REQUIRED,强制要求客户端证书。
  • 调整后端Nginx配置:负载均衡器会终止TLS并完成客户端证书验证,后端Nginx无需再处理mTLS。如果Nginx仍配置ssl_verify_client on,会因负载均衡器转发的请求不含客户端证书而触发400错误,需将该参数改为off。若需后端二次验证,需配置负载均衡器将客户端证书信息通过请求头(如X-SSL-CERT)传递给后端,再由Nginx基于该头验证。
  • 验证配置生效:更新负载均衡器配置后,等待GCP完成同步(通常数分钟),再用原curl命令测试。配置正确的话,负载均衡器会先验证客户端证书,通过后再转发请求,不会再出现Nginx返回的400错误。

另外注意:测试命令中的请求Host头不一致(命令目标是test.mytest.com,但请求头中是us-deployment-test.cloudshsm.com),虽非当前问题直接原因,但建议保持一致避免潜在问题。


内容的提问来源于stack exchange,提问作者jimakosak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 10:03:11