如何配置Nginx Ingress后端仅使用TLSv1.3协议
问题描述
我使用Nginx Ingress代理一个采用自签名证书、暴露8443(SSL)端口的应用。HTTP访问正常,但HTTPS访问时出现以下错误:
2022/10/31 18:04:28 [error] 39#39: *1855 SSL_do_handshake() failed (SSL: error:1409442E:SSL routines:ssl3_read_bytes:tlsv1 alert protocol version:SSL alert number 70) while SSL handshaking to upstream, client: 127.0.0.1, server: _, request: "GET /web-service/ HTTP/2.0", upstream: "https://10.2.1.37:8443/web-service/", host: "localhost:8443"
排查后确认,该web-service仅支持:
"TLSv1.3" and "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:TLS_AE"
使用curl测试时,若不明确指定TLSv1.3会触发类似错误;将web-service降级至TLSv1.2可正常工作,但这并非理想方案。
请问能否在Ingress本身配置Nginx后端仅使用TLSv1.3及上述加密套件?比如类似ssl_protocols TLSv1.3;的后端级注解?我尝试过代码片段,但似乎未应用到正确层级。
当前Ingress配置如下:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-world-ingress2 annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/secure-backends: "true" nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/auth-tls-verify-client: "off" nginx.ingress.kubernetes.io/rewrite-target: /web-service/$1 spec: ingressClassName: nginx rules: - http: paths: - path: /web-service/(.*) pathType: Prefix backend: service: name: my-web-service port: number: 8443
解决方案
可以通过Nginx Ingress的配置片段注解,为代理后端指定TLS协议和加密套件。核心是使用Nginx针对上游代理的SSL配置指令,注入到Ingress对应的配置块中。
修改后的Ingress配置
在原配置的metadata.annotations中添加以下配置片段:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: hello-world-ingress2 annotations: nginx.ingress.kubernetes.io/ssl-redirect: "false" nginx.ingress.kubernetes.io/backend-protocol: "HTTPS" nginx.ingress.kubernetes.io/secure-backends: "true" nginx.ingress.kubernetes.io/use-regex: "true" nginx.ingress.kubernetes.io/auth-tls-verify-client: "off" nginx.ingress.kubernetes.io/rewrite-target: /web-service/$1 # 新增:配置代理后端的SSL协议与加密套件 nginx.ingress.kubernetes.io/configuration-snippet: | proxy_ssl_protocols TLSv1.3; proxy_ssl_ciphers "TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:TLS_AES_128_CCM_SHA256:TLS_AE"; proxy_ssl_verify off; spec: ingressClassName: nginx rules: - http: paths: - path: /web-service/(.*) pathType: Prefix backend: service: name: my-web-service port: number: 8443
配置说明
proxy_ssl_protocols TLSv1.3;:强制Nginx代理与后端通信时仅使用TLSv1.3协议,匹配web-service的支持范围proxy_ssl_ciphers "...":指定与后端通信时使用的加密套件,完全对应web-service支持的列表proxy_ssl_verify off;:关闭对后端自签名证书的验证(自签名证书无法被默认CA信任,必须关闭该验证才能建立SSL连接)
应用该配置后,Nginx Ingress即可与后端web-service正常完成TLSv1.3握手,无需降级TLS版本。
内容的提问来源于stack exchange,提问作者Steve Hostettler
相关产品推荐
相关产品推荐

