TLS/HTTPS
TLS Secrets
每当我们引用TLS机密时,我们指的是PEM编码的X.509,RSA(2048)机密。
您可以使用以下方法生成自签名证书和私钥:
$ openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ${KEY_FILE} -out ${CERT_FILE} -subj "/CN=${HOST}/O=${HOST}"
然后通过以下方式在集群中创建密钥:
kubectl create secret tls ${CERT_NAME} --key ${KEY_FILE} --cert ${CERT_FILE}
产生的秘密将类型为kubernetes.io/tls
.
Default SSL Certificate
NGINX提供了将服务器配置为包含所有功能的选项 服务器名称 用于与任何已配置的服务器名称都不匹配的请求。 此配置无需HTTP流量即可使用。 对于HTTPS,自然需要证书。
因此,Ingress控制器提供了标志--default-ssl-certificate
。 此标志引用的机密包含在以下情况下使用的默认证书: 访问通用服务器。 如果未提供此标志,NGINX将使用自签名证书。
例如,如果您在default
名称空间中有一个TLS秘密foo-tls
, 在nginx-controller部署中添加--default-ssl-certificate = default/foo-tls。
缺省证书还将用于不包含入口的tls:
部分 有一个secretName
选项。
SSL Passthrough
The --enable-ssl-passthrough
flag enables the SSL Passthrough feature, which is disabled by default. This is required to enable passthrough backends in Ingress objects.
!!! warning 通过拦截已配置的HTTPS端口(默认值:443)上的 所有流量并进行处理来实现此功能。 将其转移到本地TCP代理。 这完全绕开了NGINX,并引入了不可忽略的性能损失。
SSL Passthrough利用SNI并从TLS协商中读取虚拟域,这需要兼容 客户。 TLS侦听器接受连接后,该连接将由控制器本身处理并通过管道送回 在后端和客户端之间来回。
如果没有与请求的主机名匹配的主机名,该请求将被移交给已配置的NGINX 直通代理端口(默认:442),它将请求代理到默认后端。
!!! note 与HTTP后端不同,传递给Passthrough后端的流量被发送到支持服务的 clusterIP ,而不是各个端点。
HTTP Strict Transport Security
HTTP严格传输安全性(HSTS)是指定的可选安全性增强功能 通过使用特殊的响应头。 一旦支持的浏览器收到 该标头,浏览器将阻止通过它发送任何通信 HTTP到指定的域,并且将通过HTTPS发送所有通信。
默认情况下启用HSTS。
要禁用此行为,请在配置ConfigMap中使用hsts:"false"
。
Server-side HTTPS enforcement through redirect
默认情况下,控制器将HTTP客户端重定向到HTTPS端口 如果为该入口启用了TLS,则使用308永久重定向响应443。
可以使用nginx config map中的ssl-redirect:"false"
全局禁用它, 或使用nginx.ingress.kubernetes.io/ssl-redirect:"false"
的每次进入 特定资源中的注释。
!!! tip
在群集之外(例如AWS ELB)使用SSL卸载时,强制执行
即使没有可用的TLS证书,也重定向到HTTPS。
这可以通过使用`nginx.ingress.kubernetes.io/force-ssl-redirect:"true"`来实现。
特定资源中的注释。
Automated Certificate Management with Kube-Lego
!!! 小提示 Kube-Lego 已达到使用寿命,并且正在使用 cert-manager替换.
Kube-Lego 自动从Let's Encrypt以下位置请求丢失或过期的证书 通过监视ingress资源及其引用的secret。
要为入口资源启用此功能,您必须添加注释:
kubectl annotate ing ingress-demo kubernetes.io/tls-acme="true"
要设置Kube-Lego,您可以看一下这个完整示例。 完全支持Kube-Lego的第一个版本是nginx Ingress controller 0.8。
Default TLS Version and Ciphers
为了提供最安全的基准配置,
nginx-ingress默认仅使用TLS 1.2和安全的TLS密码集。
Legacy TLS
默认配置虽然安全,但不支持某些较旧的浏览器和操作系统。
例如,仅从Android 5.0起默认启用TLS 1.1+。 在撰写本文时, 2018年5月,大约占Android设备的15% 与nginx-ingress的默认配置不兼容。
要更改此默认行为,请使用ConfigMap。
允许这些旧客户端连接的示例ConfigMap片段可能类似于以下内容:
kind: ConfigMap
apiVersion: v1
metadata:
name: nginx-config
data:
ssl-ciphers: "ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA"
ssl-protocols: "TLSv1 TLSv1.1 TLSv1.2"
Last updated
Was this helpful?