Email:Service@dogssl.com
CNY
SSL证书在云原生安全中的作用:Kubernetes Ingress配置实践
更新时间:2025-05-29 作者:Dogssl免费SSL证书申请

在K8s环境中,应用以微服务的形式运行,并通过复杂的网络拓扑进行通信。在这种开放且动态的环境中,保障通信安全至关重要,而SSL证书正是实现这一目标的核心组件。本文将深入探讨SSL证书在云原生安全中的关键作用,并详细介绍如何在Kubernetes Ingress资源上配置SSL证书,以保护外部用户与应用之间的通信。

一、SSL证书在云原生安全中的核心作用

在传统的单体应用时代,SSL证书主要用于保护Web服务器与客户端之间的HTTPS连接。在云原生环境中,其作用不仅没有减弱,反而更加关键和复杂:

1. 终端用户通信加密(HTTPS): 这是最基本也是最重要的作用。通过在Ingress层部署SSL证书,可以加密用户浏览器(或其他客户端)与K8s集群外部负载均衡器/Ingress控制器之间的所有流量,防止敏感信息(如登录凭证、个人数据)在传输过程中被窃听。

2. 服务器身份验证: SSL证书(尤其是由受信任的证书颁发机构CA签发的证书)能够向客户端证明服务器的真实身份。这有效防止了中间人攻击(MITM),确保用户连接的是预期的服务,而不是恶意冒充的服务器。

3. 服务间通信加密(mTLS): 在复杂的微服务架构中,服务之间的通信同样需要安全保护。虽然这不直接在Ingress层体现,但SSL/TLS技术(常以双向TLS或mTLS形式)被用于加密K8s内部服务间的通信,确保内部数据流的安全。Ingress配置的经验和证书管理实践可以延伸到内部服务通信的安全设计中。

4. 符合安全合规要求: 许多行业标准和法规(如GDPR、HIPAA、PCI DSS)都强制要求对传输中的数据进行加密。在云原生环境中正确部署SSL证书是满足这些合规性要求的基础。

5. 提升用户信任: 浏览器地址栏中的安全锁标志(HTTPS)是向用户展示网站安全性的直观方式,有助于建立用户信任。

二、Kubernetes Ingress与SSL证书

Ingress是Kubernetes中用于管理集群内服务外部访问的API资源,特别是HTTP和HTTPS路由。它通常与Ingress控制器(如Nginx Ingress Controller, Traefik, HAProxy等)配合工作,Ingress控制器负责实际处理入站流量并根据Ingress规则进行路由。

将SSL证书部署到Ingress层,通常有两种主要模式:

1. Ingress控制器端SSL终止: 这是最常见的模式。Ingress控制器监听HTTPS端口(通常是443),使用SSL证书与客户端进行加密通信。解密后的原始HTTP请求再转发给后端的K8s服务。这意味着从客户端到Ingress控制器是加密的HTTPS,而从Ingress控制器到后端服务是未加密的HTTP(除非另有配置)。这种模式简单,负载均衡器无需关心证书细节。

2. 负载均衡器端SSL转发: 在这种模式下,通常在K8s集群前部署的外部负载均衡器负责SSL终止。负载均衡器持有证书,与客户端进行HTTPS通信,然后将解密后的HTTP请求转发给Ingress控制器。Ingress控制器只处理未加密的HTTP流量。这种模式适用于需要集中管理证书的大型部署,或者当Ingress控制器本身不安全时。配置相对复杂,需要外部负载均衡器支持。

本文将主要聚焦于第一种模式——在Ingress控制器端进行SSL终止的配置实践。

三、Kubernetes Ingress配置SSL证书实践

要在Kubernetes Ingress上配置SSL证书,通常需要以下几个步骤:

1. 获取SSL证书

首先,你需要拥有有效的SSL证书和私钥文件。证书可以通过以下方式获取:

  • 商业CA: 如Let's Encrypt(提供免费SSL证书)、DigiCert、GlobalSign等。Let's Encrypt因其自动化和免费特性在K8s环境中非常流行。
  • 自签名证书: 仅适用于内部开发或测试环境,浏览器会将其标记为不安全。
  • 内部CA: 企业可能拥有自己的私有CA来签发证书。

重要提示: 证书文件通常包含

  • 证书文件(.crt 或 .pem): 包含公钥和服务器身份信息。
  • 私钥文件(.key 或 .pem): 包含私钥,必须严格保密。
  • CA证书链(可选但推荐): 包含签发证书的中间CA和根CA证书,确保浏览器信任。

2. 将证书和私钥存储在Kubernetes Secret中

Kubernetes Secret是存储敏感信息(如密码、令牌、密钥)的最佳实践方式。你需要创建一个Secret来存放你的证书和私钥。

假设你有以下文件:

  • mydomain.crt - 你的证书文件
  • mydomain.key - 你的私钥文件
  • ca-chain.crt - 你的CA证书链文件(可选)

你可以使用 kubectl 命令创建Secret:

1  kubectl create secret tls my-tls-secret \
2    --cert=mydomain.crt \
3    --key=mydomain.key \
4    --dry-run=client -o yaml | \
5    (if [ -f ca-chain.crt ]; then yq e '.data["ca.crt"] = strenv(ca_crt_data)' -i - && echo "Adding CA chain..."; fi) \
6    kubectl apply -f -

这里使用了 yq 工具来动态添加CA链(如果存在)。 --dry-run=client -o yaml 生成Secret的YAML定义,然后通过管道传递,如果存在CA链文件,则将其Base64编码后添加到YAML中,最后用 kubectl apply 应用。

或者,你也可以直接编辑一个YAML文件来创建Secret:

1  apiVersion: v1
2  kind: Secret
3  metadata:
4    name: my-tls-secret
5  type: kubernetes.io/tls
6  data:
7    tls.crt: <Base64 encoded mydomain.crt>
8    tls.key: <Base64 encoded mydomain.key>
9    # 可选:添加CA链
10  ca.crt: <Base64 encoded ca-chain.crt>

然后运行 kubectl apply -f secret.yaml

3. 在Ingress资源中引用Secret

创建或修改你的Ingress资源定义,在 spec.tls 部分引用你创建的Secret,并指定该证书保护哪些域名。

1  apiVersion: networking.k8s.io/v1
2  kind: Ingress
3  metadata:
4    name: my-app-ingress
5    annotations:
6      # 可选:添加Ingress Controller特定配置,如Nginx的TLS配置
7      nginx.ingress.kubernetes.io/ssl-protocols: TLSv1.2 TLSv1.3
8      nginx.ingress.kubernetes.io/ssl-ciphers: "ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256"
9  spec:
10   tls:
11   - hosts:
12      - mydomain.com
13      - www.mydomain.com
14      secretName: my-tls-secret
15    rules:
16    - host: mydomain.com
17      http:
18        paths:
19       - path: /
20         pathType: Prefix
21          backend:
22            service:
23              name: my-app-service
24              port:
25                number: 80
26    - host: www.mydomain.com
27     http:
28        paths:
29        - path: /
30          pathType: Prefix
31          backend:
32            service:
33              name: my-app-service
34              port:
35                number: 80

在这个例子中:

  • spec.tls 定义了使用 my-tls-secret 来保护 mydomain.com www.mydomain.com 这两个域名。
  • rules 部分定义了HTTP路由规则。当Ingress Controller配置为自动将HTTP重定向到HTTPS时,这些HTTP规则会捕获所有请求并将其重定向到相应的HTTPS端点。
  • metadata.annotations 中的注释是可选的,但强烈推荐。它们允许你配置Ingress Controller的特定行为,例如指定支持的TLS协议版本(如只允许TLS 1.2和1.3)和加密套件,以增强安全性。

4. 配置Ingress Controller

确保你的Ingress Controller(如Nginx Ingress Controller)已正确部署并配置为监听HTTPS流量(端口443)。大多数Ingress Controller的部署配置(Deployment或DaemonSet)会包含一个Service,该Service将外部流量路由到Controller Pods。你需要确保这个Service配置了适当的负载均衡或节点端口来暴露443端口。

例如,对于Nginx Ingress Controller,其Deployment配置通常会包含一个 template.spec.containers.args 部分,指定监听端口和模式:

1  args:
2    - /nginx-ingress-controller
3    --publish=443:8443 --publish=80:8080 --proxy-set-headers="X-Forwarded-Proto: https" --default-server-tls-secret=default/my-tls-secret
4    # 其他参数...

--publish=443:8443 表示将外部443端口映射到Pod内部的8443端口。 --proxy-set-headers="X-Forwarded-Proto: https" 确保后端服务能知道原始请求是HTTPS。 --default-server-tls-secret 可以设置一个默认的Secret,当Ingress规则没有指定TLS时使用(可选)。

5. 配置HTTP到HTTPS的重定向(强烈推荐)

为了强制所有流量都通过安全的HTTPS连接,你应该配置Ingress Controller将所有HTTP请求重定向到HTTPS。这通常通过Ingress Controller的注解或配置文件来完成。

对于Nginx Ingress Controller,可以使用注解:

1  apiVersion: networking.k8s.io/v1
2  kind: Ingress
3  metadata:
4    name: my-app-ingress
5    annotations:
6      nginx.ingress.kubernetes.io/ssl-redirect: "true" # 启用HTTP到HTTPS重定向
7      # ... 其他注解 ...
8  spec:
9    # ... 前面的TLS和rules配置 ...

或者,你可以创建一个单独的Ingress规则来处理HTTP重定向:

1  apiVersion: networking.k8s.io/v1
2  kind: Ingress
3  metadata:
4    name: my-app-http-to-https-redirection
5    annotations:
6      nginx.ingress.kubernetes.io/rewrite-target: /
7      nginx.ingress.kubernetes.io/permanent: "true" # 使用301永久重定向
8  spec:
9    rules:
10    - host: mydomain.com
11      http:
12        paths:
13        - path: /
14          pathType: Prefix
15          backend:
16            service:
17              name: redirect-to-https # 一个不存在的服务,或者一个专门用于返回301的简单服务
18              port:
19                number: 80
20    - host: www.mydomain.com
21      http:
22        paths:
23        - path: /
24          pathType: Prefix
25          backend:
26            service:
27              name: redirect-to-https
28              port:
29                number: 80

这个Ingress规则会捕获所有HTTP请求,并返回一个301重定向到对应的HTTPS URL。

6. 验证配置

应用你的Ingress和Secret配置后,访问你的域名(例如 https://mydomain.com )。你应该能看到浏览器地址栏显示安全锁标志,并且通过 https:// 访问。可以使用在线SSL检查工具(如SSLLabs的SSL Server Test)来检查你的服务器配置是否符合最佳实践。

四、自动化与高级主题

1. 自动证书管理(Let's Encrypt + Cert-Manager)

手动管理证书的轮换和更新非常繁琐。Cert-Manager是一个Kubernetes的证书管理控制器,可以与Let's Encrypt等ACME证书颁发机构集成,自动为你的Ingress资源申请、更新和续订SSL证书。

安装Cert-Manager并创建一个Issuer或ClusterIssuer资源来配置Let's Encrypt。然后,在你的Ingress资源上添加 cert-manager.io/cluster-issuer 注解,Cert-Manager就会自动处理证书的整个生命周期。

1  metadata:
2    annotations:
3      cert-manager.io/cluster-issuer: "letsencrypt-prod"

2. 双向TLS(mTLS)用于服务间通信

虽然Ingress主要处理外部流量,但SSL/TLS技术同样可以用于K8s内部服务间的安全通信。这通常称为双向TLS(mTLS),其中客户端和服务器都需要提供证书进行相互认证。这超出了Ingress的范畴,但与证书管理相关。可以使用类似cert-manager的工具结合K8s的SPIFFE/SPIRE标准或自定义解决方案来实现。

3. 内部CA与证书颁发

对于企业环境,可能需要使用内部CA来签发证书,以确保证书的可信度和统一管理。这需要配置K8s集群信任内部CA的根证书,并可能需要自定义工具或流程来为Ingress Controller或内部服务签发证书。

SSL证书在云原生安全中扮演着至关重要的角色,尤其是在Kubernetes环境中,它保护着用户与应用之间的通信安全。通过将证书存储在Kubernetes Secret中,并在Ingress资源中正确引用,可以轻松实现Ingress控制器端的SSL终止。结合HTTP到HTTPS的重定向和现代TLS协议/加密套件的配置,可以构建一个既安全又符合现代Web标准的通信管道。自动化工具如Cert-Manager进一步简化了证书管理的复杂性,使其在动态变化的云原生环境中保持高效和可靠。正确配置SSL证书不仅是满足合规性的要求,更是赢得用户信任、保障业务连续性的基石。


Dogssl.com拥有20年网络安全服务经验,提供构涵盖国际CA机构SectigoDigicertGeoTrustGlobalSign,以及国内CA机构CFCA沃通vTrus上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!
相关文档
立即加入,让您的品牌更加安全可靠!
申请SSL证书
0.104995s