将 SSL 证书私钥上传至第三方平台存在安全合规风险,无法满足私钥不出站的要求。本文介绍如何搭建 KeyServer 并在 边缘安全加速 ESA 控制台配置 Keyless 证书,实现私钥自主管理的 HTTPS 加速服务。
什么是Keyless证书
使用传统 CDN 方案时,通常需要将完整的证书和私钥上传至 CDN 控制台。如果私钥托管在第三方平台,存在泄露风险。
Keyless 证书(Keyless SSL)是一种高级 SSL/TLS 安全方案,允许将私钥保留在自有服务器中,仅在 ESA 边缘节点保存证书公钥。当用户发起 HTTPS 请求时,边缘节点向用户的 KeyServer 发起远程签名请求,完成 TLS 握手。整个过程中,私钥始终不离开用户的服务器。
相比传统方案,Keyless 证书具有以下优势:
私钥不离开自有服务器:私钥始终保存在自有服务器中,不上传至任何第三方平台
满足合规要求:满足金融、政务等行业对私钥管理的严格合规要求
集中管理:通过 KeyServer 统一管理多个域名的私钥
适用场景
安全合规:金融、政务等行业对私钥管理有严格的合规要求,不允许将私钥上传至第三方平台。
私钥集中管理:拥有多台服务器,需要统一管理不同域名的私钥,避免私钥分散存储。
HSM 使用场景:使用硬件安全模块(HSM)管理私钥,HSM 不允许私钥导出,但需要通过 HSM 完成 TLS 握手签名。
工作原理
ECDHE 密钥交换流程
TLS 握手使用 ECDHE 密钥交换时,Keyless 证书的工作流程如下:
客户端向边缘节点发起 TLS 握手,发送 ClientHello 消息。
边缘节点将握手参数转发至预先配置的 KeyServer。
KeyServer 使用本地存储的私钥完成 ECDHE 签名计算,将签名数据返回给边缘节点。
边缘节点将 ServerHello 及签名数据返回给客户端。
客户端验证签名通过,双方建立 ECDHE 加密通道。
整个过程中,私钥始终保留在 KeyServer 本地,边缘节点不持有私钥。
RSA 密钥交换流程
使用 RSA 密钥交换时,流程类似:
客户端发送 ClientHello,边缘节点将握手信息转发至 KeyServer。
KeyServer 使用 RSA 私钥对 Pre-Master Secret 进行签名,返回签名数据。
边缘节点完成握手流程,建立加密通道。
通信安全
边缘节点与 KeyServer 之间采用双向 TLS 认证,保障通信通道的安全性。在配置 KeyServer 时,可选择是否开启 KeyServer 认证。开启后,边缘节点将强制认证 KeyServer 证书。
边缘节点仅持有证书公钥,私钥存储在 KeyServer 中。每次 TLS 握手时,边缘节点向 KeyServer 发起远程签名请求,完成握手。
前提条件
已在 ESA 控制台添加站点
已开启 SSL/TLS 功能
已准备一台可公网访问的服务器用于部署 KeyServer,且 KeyServer 端口可被 ESA 边缘节点访问
已准备好 SSL 证书的公钥文件(.pem 或 .crt 格式)
当前套餐支持 Keyless 证书功能,请在控制台确认配额。详情请参见选择适合您的套餐
操作流程
配置 Keyless 证书包含以下三个步骤:
搭建并启动 KeyServer
在 ESA 控制台配置 KeyServer 地址
上传 Keyless 证书并关联 KeyServer
步骤一:搭建并启动 KeyServer
在自有服务器上完成以下操作:
获取 KeyServer 源码
编译构建 KeyServer 程序
生成通信通道证书(边缘节点与 KeyServer 之间的双向 TLS 认证)
配置并启动 KeyServer
获取源码
KeyServer 开源代码托管在 GitHub 上。从开源仓库 alibabacloud-dcdn-keyserver 克隆 KeyServer 代码:
git clone https://github.com/alibaba/alibabacloud-dcdn-keyserver.git
cd alibabacloud-dcdn-keyserver
git submodule update --init编译构建
KeyServer 基于 Nginx 构建,需要先下载 Nginx 源码并应用相关补丁:
# 应用补丁
patch -p1 -d deps/nginx_tcp_proxy_module/ < tcp_module_compile_fixed.patch
patch -p1 -d deps/nginx_tcp_proxy_module/ < tcp_lurk_keepalive.patch
patch -p1 -d deps/nginx_tcp_proxy_module/ < tcp_access_log_format.patch
patch -p1 -d deps/OpenSSL_1_1_1-stable/ < lurk_openssl_1_1_1-stable.patch
# 下载并解压 Nginx
wget 'https://nginx.org/download/nginx-1.26.2.tar.gz'
tar -xzvf nginx-1.26.2.tar.gz
# 应用 Nginx TCP 模块补丁
patch -p1 -d nginx-1.26.2 < deps/nginx_tcp_proxy_module/tcp.patch
# 编译
cd nginx-1.26.2
./configure \
--with-http_ssl_module \
--with-openssl=../deps/OpenSSL_1_1_1-stable \
--add-module=../deps/nginx_tcp_proxy_module \
--add-module=.. \
--with-cc-opt="-Wno-implicit-fallthrough"
make编译完成后,可执行文件位于 nginx-1.26.2/objs/nginx。
生成通信通道证书
KeyServer 与 ESA 边缘节点之间通过 TLS 加密通道通信,您需要为此通道生成专用的证书和私钥:
# 创建 OpenSSL 配置文件
cat > openssl.conf << EOF
[ req ]
default_bits = 2048
encrypt_key = no
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
EOF
# 生成自签名证书和私钥
openssl req -x509 -new -config ./openssl.conf \
-subj /CN=keyserver/ \
-out keyserver-channel.pem \
-keyout keyserver-channel.key请妥善保存生成的 keyserver-channel.pem(证书)和 keyserver-channel.key(私钥),在后续步骤中需要将证书内容配置到 ESA 控制台。
配置并启动 KeyServer
编辑 KeyServer 配置文件(参考项目中的 config 文件),主要配置项如下:
user root;
worker_processes auto;
error_log logs/error.log;
events {
worker_connections 1024;
}
tcp {
# 访问日志格式
log_format main '{"time":$lurk_start_time,"client_ip":"$client_ip","server_ip":"$host_ip","lurk_id":$lurk_id,"lurk_type":$lurk_type,"lurk_error":$lurk_err_code}';
access_log logs/lurk_access.log main;
lurk_get_key_mode local;
server {
# KeyServer 监听端口
listen 8443 ssl;
# 通信通道 TLS 证书和私钥
ssl_certificate /path/to/keyserver-channel.pem;
ssl_certificate_key /path/to/keyserver-channel.key;
ssl_protocols TLSv1.2;
ssl_ciphers EECDH+AES256;
ssl_session_cache shared:lurk:100m;
ssl_session_timeout 8h;
ssl_prefer_server_ciphers on;
lurk;
# 业务证书私钥存放目录
lurk_pkey_path /path/to/pkeys;
lurk_keepalive_requests 1000;
}
}关键配置说明:
配置项 | 说明 |
| KeyServer 监听的端口,默认为 8443,支持 SSL |
| 通信通道使用的 TLS 证书文件路径 |
| 通信通道使用的 TLS 私钥文件路径 |
| 业务域名 SSL 证书的私钥文件存放目录。将需要托管的私钥文件放入此目录即可 |
| 单个长连接上允许的最大请求数 |
将您业务域名证书对应的私钥文件复制到 lurk_pkey_path 指定的目录中:
1mkdir -p /path/to/pkeys
2cp your-domain.key /path/to/pkeys/使用配置文件启动 KeyServer:
/path/to/nginx -c /path/to/keyserver.conf启动后,请确保 KeyServer 的监听端口(默认 8443)可被公网访问。您可以通过防火墙或安全组规则来限制仅允许 ESA 边缘节点的 IP 段访问该端口。
步骤二:在 ESA 控制台配置 KeyServer 地址
完成 KeyServer 搭建后,在 ESA 控制台添加 KeyServer 地址,使边缘节点能够与 KeyServer 通信。
在ESA控制台选择站点管理,在站点列单击目标站点。
在左侧导航栏,选择。
在 KeyServer 面板中,点击 配置。
说明如果 配置 按钮置灰并提示“KeyServer 配置已达上限”,说明当前站点的 KeyServer 配置数量已达到套餐配额上限。
填写 KeyServer 配置表单:
配置项
说明
是否必填
示例
名称
KeyServer 的名称标识,最长 256 字符
是
my-keyserver服务器地址
KeyServer 服务器地址,支持 IP 或域名
是
192.168.1.100服务器端口
KeyServer 监听端口,范围 1~65535
是
8443KeyServer认证
开启后将强制认证 KeyServer 证书
否
开启
认证 CA
PEM 格式 CA 证书,开启 KeyServer 认证时需要配置
开启KeyServer认证后必填
粘贴 PEM 格式内容
KeyClient 证书
PEM 格式客户端证书,用于与 KeyServer 双向认证
否
粘贴 PEM 格式内容
KeyClient 私钥
PEM 格式客户端私钥,用于与 KeyServer 双向认证
否
粘贴 PEM 格式内容
说明认证 CA字段仅在KeyServer认证开关开启时显示。KeyClient 证书和KeyClient 私钥字段始终显示,但为可选填项。
点击确定保存配置。
步骤三:上传 Keyless 证书并关联 KeyServer
完成 KeyServer 地址配置后,上传 SSL 证书(公钥)并将其与 KeyServer 关联。
在证书配置页面的证书管理面板中,点击 上传自定义证书。
在证书来源中选择 Keyless 证书。
说明Keyless 证书选项仅在 KeyServer 功能可用时显示。如果未看到该选项,请确认 KeyServer 开关已开启。
填写证书信息:
配置项
说明
是否必填
Keyless 证书
从下拉列表中选择步骤二已配置好的 KeyServer
是
证书名称
自定义证书名称
是
证书(公钥)
粘贴 PEM 格式的证书公钥内容
是
说明Keyless 证书不需要填写私钥,私钥由 KeyServer 管理。
点击确定,完成 Keyless 证书的配置。
配置完成后,证书列表中将显示该 Keyless 证书,类型显示为Keyless 证书。
验证配置
完成 Keyless 证书配置后,通过以下方式验证配置是否生效:
使用 curl 命令测试 HTTPS 握手:
curl -vI https://your-domain.com预期输出中包含
SSL certificate verify ok,且证书颁发者与实际证书一致。在 ESA 控制台的证书管理列表中,查看该证书的状态是否为正常。
常见失败场景
失败场景 | 排查建议 |
KeyServer 端口不通 | 检查 KeyServer 服务器是否运行正常,防火墙是否放行了 KeyServer 端口,确保 ESA 边缘节点可公网访问该端口 |
证书链不完整 | 确保证书公钥文件包含完整的证书链(服务器证书 + 中间证书),可联系证书颁发机构获取完整链文件 |
KeyServer 签名超时 | 检查 KeyServer 服务器负载是否正常,确认网络延迟在可接受范围内 |
不同套餐的支持情况
当前该功能仅支持企业版套餐使用。