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

Automated Certificate Management with Kube-Lego

!!! 小提示 Kube-Lego 已达到使用寿命,并且正在使用 cert-manager替换.

Kube-Lego 自动从Let's Encrypt以下位置请求丢失或过期的证书 通过监视ingress资源及其引用的secret。

要为入口资源启用此功能,您必须添加注释:

要设置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片段可能类似于以下内容:

Last updated

Was this helpful?