You need to enable JavaScript to run this app.
文档中心
容器服务

容器服务

复制全文
下载 pdf
证书与安全
为 ALB Ingress 配置 HTTPS 双向认证
复制全文
下载 pdf
为 ALB Ingress 配置 HTTPS 双向认证
ALB Ingress 支持通过配置 HTTPS 双向认证功能,保证 HTTPS 场景下的服务器和客户端安全。本文介绍 ALB 配置 HTTPS 双向认证的主要场景和配置方法。​
注意​
配置 ALB Ingress 前,请务必仔细阅读 ALB Ingress 使用注意事项。​
背景信息​
在互联网通信安全体系中,HTTPS 协议通过 SSL/TLS 层实现数据加密与身份验证,常见的核心身份校验模式包括:单向认证和双向认证。两者的主要概念和区别,如下表所示。​
​
认证方式​
基本概念​
认证流程​
单向认证​
  • 客户端主导的基础安全认证方式。​
  • 核心逻辑是“仅客户端验证服务器身份,服务器不校验客户端身份”。​
  • 本质是通过数字证书机制确保客户端访问的是合法服务器,而非钓鱼或伪造站点。​
  1. 客户端向服务器发起 HTTPS 连接请求,明确告知支持的 SSL/TLS 版本与加密算法。​
  1. 服务器收到请求后,向客户端发送自身的 SSL 证书(包含服务器公钥、域名信息、证书有效期、签发机构 CA 的数字签名等核心数据)。​
  1. 客户端对接收到的证书进行多层验证,先检查证书是否在有效期内,再通过内置的可信 CA 根证书验证证书签名的合法性,同时确认证书中的域名与实际访问的服务器域名一致,若所有验证均通过,则使用证书中的公钥与服务器协商后续数据传输的对称加密密钥,完成安全连接建立。​
双向认证​
  • 客户端 + 服务器互验的高安全认证方式。​
  • 在单向认证的基础上增加了“服务器验证客户端身份”的环节,形成“客户端验证服务器 + 服务器验证客户端”的双向身份校验机制。​
  • 针对高安全需求场景设计的认证模式。​
  1. 前三步与单向认证一致,即客户端发起请求、服务器发送证书、客户端验证服务器证书并通过。​
  1. 服务器在收到客户端的连接确认后,会向客户端发送证书请求,要求客户端提供自身的 SSL 证书。​
  1. 客户端向服务器发送包含自身身份信息(如用户 ID、设备编号等)的客户端证书。​
  1. 服务器按照与客户端验证服务器证书相同的逻辑,检查客户端证书的有效期、签名合法性(需信任签发客户端证书的 CA 机构),同时根据业务规则验证证书对应的身份是否具备访问权限(如确认该客户端是否为企业内部授权员工、是否属于指定设备组等);若服务器验证客户端证书通过,则最终完成对称加密密钥协商,建立双向安全连接;若任何一方的证书验证失败,连接会直接中断。​
​
说明​
推荐您使用火山引擎证书中心购买和管理证书。如您还未购买证书,可以参照下文生成自签名证书。​
前提条件​
  • 已安装 alb-ingress-controller 组件,并升级至 v0.32.0 及以上版本。详情请参见 升级组件。​
操作步骤​
步骤一:生成证书​
生成自签名 CA 证书​
  1. 在本地环境中,访问 OpenSSL 官网,下载并安装 OpenSSL。​
  1. 执行以下命令,生成 4096 位的 CA 私钥。​
  • ​
    openssl genrsa -out ca.key 4096​
    ​
  1. 执行以下命令,使用 CA 私钥生成根 CA 证书。​
  • ​
    openssl req -new -x509 -key ca.key -out ca.crt​
    ​
  • 预期结果如下,需要填写证书的相关信息,包括:国家、地区、组织名称、域名、电子邮件地址等。​
  • ​
    You are about to be asked to enter information that will be incorporated​
    into your certificate request.​
    What you are about to enter is what is called a Distinguished Name or a DN.​
    There are quite a few fields but you can leave some blank​
    For some fields there will be a default value,​
    If you enter '.', the field will be left blank.​
    -----​
    Country Name (2 letter code) []:CN # 2 位国家代码,例如 CN​
    State or Province Name (full name) []:Shanghai # 地区名称,例如 Shanghai​
    Locality Name (eg, city) []:Shanghai # 城市名称,例如 Shanghai​
    Organization Name (eg, company) []:vke # 组织名称​
    Organizational Unit Name (eg, section) []:vke # 组织中的单位名称​
    Common Name (eg, fully qualified host name) []:example.com # 该证书对应的域名​
    Email Address []:user@example.com # 电子邮件地址​
    ​
    Please enter the following 'extra' attributes​
    to be sent with your certificate request​
    A challenge password []:mypassword # 密码,可以为空​
    ​
  1. 完成创建根 CA 证书,包括私钥ca.key和证书ca.crt。​
生成服务端证书​
  1. 执行以下命令,生成 2048 位的服务端私钥。​
  • ​
    openssl genrsa -out server.key 2048​
    ​
  1. 执行以下命令,使用服务端私钥生成服务端证书请求。​
  • ​
    openssl req -new -key server.key -out server.csr​
    ​
  • 预期结果如下,需要填写证书的相关信息,包括:国家、地区、组织名称、域名、电子邮件地址等。​
  • ​
    You are about to be asked to enter information that will be incorporated​
    into your certificate request.​
    What you are about to enter is what is called a Distinguished Name or a DN.​
    There are quite a few fields but you can leave some blank​
    For some fields there will be a default value,​
    If you enter '.', the field will be left blank.​
    -----​
    Country Name (2 letter code) []:CN # 2 位国家代码,例如 CN​
    State or Province Name (full name) []:Shanghai # 地区名称,例如 Shanghai​
    Locality Name (eg, city) []:Shanghai # 城市名称,例如 Shanghai​
    Organization Name (eg, company) []:vke # 组织名称​
    Organizational Unit Name (eg, section) []:vke # 组织中的单位名称​
    Common Name (eg, fully qualified host name) []:example.com # 该证书对应的域名​
    Email Address []:user@example.com # 电子邮件地址​
    ​
    Please enter the following 'extra' attributes​
    to be sent with your certificate request​
    A challenge password []:mypassword # 密码,可以为空​
    ​
  1. 执行以下命令,使用 CA 证书签发服务端证书,有效期配置为 365 天。​
  • ​
    openssl x509 -req -in server.csr -out server.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 365​
    ​
  1. 完成创建服务端证书,包括私钥server.key和证书server.crt。​
生成客户端证书​
  1. 执行以下命令,生成 2048 位的客户端私钥。​
  • ​
    openssl genrsa -out client.key 2048​
    ​
  1. 执行以下命令,使用客户端私钥生成客户端证书请求。​
  • ​
    openssl req -new -key client.key -out client.csr​
    ​
  • 预期结果如下,需要填写证书的相关信息,包括:国家、地区、组织名称、域名、电子邮件地址等。​
  • ​
    You are about to be asked to enter information that will be incorporated​
    into your certificate request.​
    What you are about to enter is what is called a Distinguished Name or a DN.​
    There are quite a few fields but you can leave some blank​
    For some fields there will be a default value,​
    If you enter '.', the field will be left blank.​
    -----​
    Country Name (2 letter code) []:CN # 2 位国家代码,例如 CN​
    State or Province Name (full name) []:Shanghai # 地区名称,例如 Shanghai​
    Locality Name (eg, city) []:Shanghai # 城市名称,例如 Shanghai​
    Organization Name (eg, company) []:vke # 组织名称​
    Organizational Unit Name (eg, section) []:vke # 组织中的单位名称​
    Common Name (eg, fully qualified host name) []:example.com # 该证书对应的域名​
    Email Address []:user@example.com # 电子邮件地址​
    ​
    Please enter the following 'extra' attributes​
    to be sent with your certificate request​
    A challenge password []:mypassword # 密码,可以为空​
    ​
  1. 执行以下命令,使用 CA 证书签发客户端证书,有效期配置为 365 天。​
  • ​
    openssl x509 -req -in client.csr -out client.crt -CA ca.crt -CAkey ca.key -CAcreateserial -days 365​
    ​
  1. 完成创建客户端证书,包括私钥client.key和证书client.crt。​
步骤二:上传证书​
  • ​alt​​
  • ​alt​​
步骤三:配置 ALBInstance​
使用 ALBInstance 对接已有 ALB 实例或创建新的 ALB 实例时,支持使用spec.listeners中的caEnabled和caCertificates字段配置 HTTPS 双向认证。本小节以对接已有 ALB 实例为例,示例和说明如下:​
​
apiVersion: loadbalancer.vke.volcengine.com/v1beta1​
kind: ALBInstance​
metadata:​
name: alb # ALBInstance 资源名称​
spec:​
instanceID: "alb-2dgns526uiv41fi5***" # 已有 ALB 实例的 ID​
listeners:​
- protocol: "HTTP" # 监听器的协议​
port: 80 # 监听器协议为 HTTP 时的监听端口​
- protocol: "HTTPS" # 监听器的协议​
port: 443 # 监听器协议为 HTTPS 时的监听端口​
certificateSource: "alb" # 监听器证书来源,取值:alb(ALB)、cert_center(证书中心)。​
certificateID: "cert-2wx20lm7uquww7oot***" # 监听器协议为 HTTPS 时默认全域名使用的服务器证书​
caEnabled: true # 监听器 HTTPS 双向认证开关,true 表示开启,flase 表示关闭​
caCertificates:​
- caCertificateID: "cert-xobjnz7dx0jk54o***" # HTTPS 双向认证私有根 CA 证书 ID​
caCertificateSource: "alb" # HTTPS 双向认证证书来源,取值:alb(ALB)、pca_root(证书中心私有根 CA 证书)、pca_sub(证书中心私有子 CA 证书)。​
​
spec.listeners中caEnabled和caCertificates字段的参数说明如下所示。​
​
字段​
类型​
是否必选​
描述​
取值示例​
是否支持修改​
caEnabled​
Boolean​
否​
监听器 HTTPS 双向认证开关。取值:​
  • true:启用 HTTPS 双向认证。​
  • false:禁用 HTTPS 双向认证。​
说明​
未配置该字段时,表示不会修改 ALB 侧监听器的 HTTPS 双向认证配置。​
true​
是​
caCertificateID​
String​
否​
HTTPS 双向认证证书 ID。​
说明​
当caEnabled为true时,必须配置。​
cert-2wx20lm7uquww7oot********​
是​
caCertificateSource​
String​
否​
HTTPS 双向认证证书来源。取值:​
  • alb:(默认)ALB 上传的证书。​
  • pca_root:火山引擎证书中心购买或上传的私有根 CA 证书。​
  • pca_sub:火山引擎证书中心购买或上传的私有子 CA 证书。​
注意​
当caEnabled为true时,必须配置。​
alb​
是​
​
说明​
当前caCertificates字段仅支持配置一个证书来源和证书 ID。​
步骤四:配置 ALB Ingress​
创建路由规则(Ingress),并选择 HTTPS 监听器。示例代码如下:​
​
apiVersion: networking.k8s.io/v1​
kind: Ingress​
metadata:​
name: alb-ingress-demo # 路由规则的名称​
namespace: default # 路由规则所属的命名空间​
annotations:​
ingress.vke.volcengine.com/loadbalancer-port: "443" # 监听器端口号​
ingress.vke.volcengine.com/loadbalancer-protocol: "https" # 监听器协议。本例中取值为 https​
spec:​
ingressClassName: alb # ALBInstance 的资源名称​
rules:​
- host: example.com # 需要对外提供访问的域名​
http:​
paths:​
- pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)​
path: / # 请求匹配的路径​
backend:​
service:​
name: service-demo # 需要对接的服务名称​
port: ​
number: 80 # 需要对接服务的端口号​
​
说明​
本例中使用最简单的方式创建 ALB Ingress。更多配置,请参见 通过 kubectl 创建 ALB Ingress。​
结果验证​
查看配置​
  1. 执行以下命令,查看 ingress 配置。​
  • ​
    kubectl get ingress​
    ​
  • 预期返回结果如下,表示 ALB Ingress 创建成功。​
  • ​
    NAME CLASS HOSTS ADDRESS PORTS AGE​
    alb-ingress-demo alb example.com 180.xxx.xxx.xxx 80,443 74s​
    ​
  1. 在左侧导航栏中选择 实例管理,单击目标 ALB 实例名称,进入实例详情页面。​
  1. 选择 监听器 页签,单击端口为 443 的监听器名称,查看监听器详情。可以看到监听器已基于配置,开启了双向认证功能。​
  • ​​​
访问服务​
说明​
验证功能前,您需要在集群中部署后端应用和服务。本例中以 nginx 镜像,服务提供路径为/为例。部署操作方式,请参考 使用 ALB Ingress 实现业务发布。​
  1. 使用以下命令,通过域名访问服务。​
  • ​
    curl -H "Host: example.com" https://180.xxx.xxx.xxx --insecure​
    ​
  • 预期输出如下,由于访问未携带客户端证书,不满足 HTTPS 双向认证要求,因此无法访问到后端服务。​
  • ​
    <html>​
    <head><title>400 No required SSL certificate was sent</title></head>​
    <body bgcolor="white">​
    <center><h1>400 Bad Request</h1></center>​
    <center>No required SSL certificate was sent</center>​
    </body>​
    </html>​
    ​
  1. 再次使用以下命令,携带客户端证书和密钥访问服务。​
  • ​
    curl -H "Host: example.com" https://180.xxx.xxx.xxx --insecure --cert client.crt --key client.key​
    ​
  • 预期输出如下,由于携带了客户端证书,满足 HTTPS 双向认证要求,可以正常访问到后端服务。​
  • ​
    <!DOCTYPE html>​
    <html>​
    <head>​
    <title>Welcome to nginx!</title>​
    <style>​
    html { color-scheme: light dark; }​
    body { width: 35em; margin: 0 auto;​
    font-family: Tahoma, Verdana, Arial, sans-serif; }​
    </style>​
    </head>​
    <body>​
    <h1>Welcome to nginx!</h1>​
    <p>If you see this page, the nginx web server is successfully installed and​
    working. Further configuration is required.</p>​
    ​
    <p>For online documentation and support please refer to​
    <a href="http://nginx.org/">nginx.org</a>.<br/>​
    Commercial support is available at​
    <a href="http://nginx.com/">nginx.com</a>.</p>​
    ​
    <p><em>Thank you for using nginx.</em></p>​
    </body>​
    </html>​
    ​
​
最近更新时间:2026.04.07 14:19:46
这个页面对您有帮助吗?
有用
有用
无用
无用