问题背景:
最近使用ingress-nginx做网关,在配置证书时发现了ingress的下列报错:
最近使用ingress-nginx做网关,在配置证书时发现了ingress的下列报错:
W0727 17:38:18.880927 7 controller.go:1331] Unexpected error validating SSL certificate "datalake-gateway/tls-secret" for server "xxx.xx.com.cn": x509: certificate relies on legacy Common Name field, use SANs instead
W0727 17:38:18.880961 7 controller.go:1332] Validating certificate against DNS names. This will be deprecated in a future version
这里提示需要使用SANs证书
那么什么是SANs证书呢?
1.SANs证书是指Subject Alternative Names证书,也被称为多域名证书。它是一种用于加密通信的数字证书,用于保护网站、服务器或其他网络设备的安全性。
2.SANs证书允许在单个证书中列出多个域名或主机名。这意味着可以使用同一个证书来保护多个域名或子域名,而不需要为每个域名单独购买和管理证书。
3.SANs证书的主要优势在于简化了证书管理过程,减少了成本和复杂性。它适用于具有多个域名或子域名的网站、虚拟主机环境、负载均衡器、邮件服务器等。
4.使用SANs证书可以确保所有列出的域名都受到相同的加密保护,提供与单个域名证书相同的安全性和可信度。常见的SANs证书提供商包括Symantec、Comodo、DigiCert等。
总之,SANs证书是一种用于保护多个域名或主机名的数字证书,简化了证书管理过程,提供了更高的安全性和便利性
如何创建SANs自签名证书并在ingress配置呢?
1、安装 OpenSSL:首先,您需要在计算机上安装 OpenSSL 工具。您可以从 OpenSSL 官方网站(https://www.openssl.org/)下载适用于您的操作系统的最新版本。
生成私钥:打开终端或命令提示符,并导航到您安装 OpenSSL 的目录。然后执行以下命令生成私钥文件:
openssl genpkey -algorithm RSA -out private.key
这将生成一个名为 private.key 的私钥文件。
创建证书请求:执行以下命令创建证书请求文件(CSR):
openssl req -new -key private.key -out csr.csr
在执行此命令时,您将被要求提供一些信息,例如国家/地区、组织、通用名称等。请根据您的需求提供正确的信息。
创建 SAN 配置文件:创建一个名为 san.cnf 的文本文件,并在其中添加以下内容:
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[req_distinguished_name]
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = example.com
DNS.2 = www.example.com
在 [alt_names] 部分,您可以添加您希望包含在证书中的主机名或域名。在上面的示例中,我们添加了两个示例域名。
生成 SAN 证书:执行以下命令生成包含 SAN 的证书:
openssl x509 -req -in csr.csr -signkey private.key -out certificate.crt -extfile san.cnf -extensions v3_req -days 365
这将使用私钥和证书请求文件生成一个名为 certificate.crt 的自签名证书文件。证书的有效期为 365 天。
现在,您已经成功创建了一个包含 SAN 的自签名证书。请注意,自签名证书在公共环境中可能不被广泛接受,因为它们没有由受信任的第三方机构签名。在生产环境中,建议使用由受信任的证书颁发机构(CA)签名的证书。
配置ingress证书:
要在Ingress中配置证书,您需要执行以下步骤:
创建一个Kubernetes Secret对象,其中包含您的TLS证书和私钥。您可以使用以下命令创建一个Secret对象:
kubectl create secret tls <secret-name> --key private.key --cert certificate.crt
其中,<secret-name>是您想要为Secret对象指定的名称,private.key是您的私钥文件的路径,certificate.crt是您的证书文件的路径。
在Ingress规则中指定TLS证书。您可以使用以下示例Ingress规则:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "true"
nginx.ingress.kubernetes.io/ssl-passthrough: "true"
spec:
tls:
- hosts:
- example.com
secretName: <secret-name>
rules:
- host: example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: example-service
port:
name: http
其中,<secret-name>是您在第1步中创建的Secret对象的名称。tls字段指定了要使用的TLS证书,rules字段指定了Ingress规则的路由规则。
应用Ingress规则。您可以使用以下命令将Ingress规则应用于Kubernetes集群:
kubectl apply -f <path-to-ingress-rule-file>
其中,<path-to-ingress-rule-file>是包含Ingress规则的YAML文件的路径。
完成这些步骤后,您的Ingress将使用TLS证书进行加密通信。