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
相关产品推荐
相关产品推荐

