{{item}}
{{item.title}}
{{items.productName}}
{{items.price}}/年
{{item.title}}
部警SSL证书可实现网站HTTPS加密保护及身份的可信认证,防止传输数据的泄露或算改,提高网站可信度和品牌形象,利于SEO排名,为企业带来更多访问量,这也是网络安全法及PCI合规性的必备要求
前往SSL证书在K8s环境中,应用以微服务的形式运行,并通过复杂的网络拓扑进行通信。在这种开放且动态的环境中,保障通信安全至关重要,而SSL证书正是实现这一目标的核心组件。本文将深入探讨SSL证书在云原生安全中的关键作用,并详细介绍如何在Kubernetes Ingress资源上配置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)是向用户展示网站安全性的直观方式,有助于建立用户信任。
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证书,通常需要以下几个步骤:
首先,你需要拥有有效的SSL证书和私钥文件。证书可以通过以下方式获取:
重要提示: 证书文件通常包含
Kubernetes Secret是存储敏感信息(如密码、令牌、密钥)的最佳实践方式。你需要创建一个Secret来存放你的证书和私钥。
假设你有以下文件:
你可以使用 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 。
创建或修改你的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
在这个例子中:
确保你的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时使用(可选)。
为了强制所有流量都通过安全的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。
应用你的Ingress和Secret配置后,访问你的域名(例如 https://mydomain.com )。你应该能看到浏览器地址栏显示安全锁标志,并且通过 https:// 访问。可以使用在线SSL检查工具(如SSLLabs的SSL Server Test)来检查你的服务器配置是否符合最佳实践。
手动管理证书的轮换和更新非常繁琐。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"
虽然Ingress主要处理外部流量,但SSL/TLS技术同样可以用于K8s内部服务间的安全通信。这通常称为双向TLS(mTLS),其中客户端和服务器都需要提供证书进行相互认证。这超出了Ingress的范畴,但与证书管理相关。可以使用类似cert-manager的工具结合K8s的SPIFFE/SPIRE标准或自定义解决方案来实现。
对于企业环境,可能需要使用内部CA来签发证书,以确保证书的可信度和统一管理。这需要配置K8s集群信任内部CA的根证书,并可能需要自定义工具或流程来为Ingress Controller或内部服务签发证书。
SSL证书在云原生安全中扮演着至关重要的角色,尤其是在Kubernetes环境中,它保护着用户与应用之间的通信安全。通过将证书存储在Kubernetes Secret中,并在Ingress资源中正确引用,可以轻松实现Ingress控制器端的SSL终止。结合HTTP到HTTPS的重定向和现代TLS协议/加密套件的配置,可以构建一个既安全又符合现代Web标准的通信管道。自动化工具如Cert-Manager进一步简化了证书管理的复杂性,使其在动态变化的云原生环境中保持高效和可靠。正确配置SSL证书不仅是满足合规性的要求,更是赢得用户信任、保障业务连续性的基石。
Dogssl.com拥有20年网络安全服务经验,提供构涵盖国际CA机构Sectigo、Digicert、GeoTrust、GlobalSign,以及国内CA机构CFCA、沃通、vTrus、上海CA等数十个SSL证书品牌。全程技术支持及免费部署服务,如您有SSL证书需求,欢迎联系!