配置Keyless证书

更新时间:
复制为 MD 格式

将 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 证书的工作流程如下:

image
  1. 客户端向边缘节点发起 TLS 握手,发送 ClientHello 消息。

  2. 边缘节点将握手参数转发至预先配置的 KeyServer。

  3. KeyServer 使用本地存储的私钥完成 ECDHE 签名计算,将签名数据返回给边缘节点。

  4. 边缘节点将 ServerHello 及签名数据返回给客户端。

  5. 客户端验证签名通过,双方建立 ECDHE 加密通道。

说明

整个过程中,私钥始终保留在 KeyServer 本地,边缘节点不持有私钥。

RSA 密钥交换流程

使用 RSA 密钥交换时,流程类似:

image
  1. 客户端发送 ClientHello,边缘节点将握手信息转发至 KeyServer。

  2. KeyServer 使用 RSA 私钥对 Pre-Master Secret 进行签名,返回签名数据。

  3. 边缘节点完成握手流程,建立加密通道。

通信安全

边缘节点与 KeyServer 之间采用双向 TLS 认证,保障通信通道的安全性。在配置 KeyServer 时,可选择是否开启 KeyServer 认证。开启后,边缘节点将强制认证 KeyServer 证书。

边缘节点仅持有证书公钥,私钥存储在 KeyServer 中。每次 TLS 握手时,边缘节点向 KeyServer 发起远程签名请求,完成握手。

前提条件

  • 已在 ESA 控制台添加站点

  • 已开启 SSL/TLS 功能

  • 已准备一台可公网访问的服务器用于部署 KeyServer,且 KeyServer 端口可被 ESA 边缘节点访问

  • 已准备好 SSL 证书的公钥文件(.pem 或 .crt 格式)

  • 当前套餐支持 Keyless 证书功能,请在控制台确认配额。详情请参见选择适合您的套餐

操作流程

配置 Keyless 证书包含以下三个步骤:

  1. 搭建并启动 KeyServer

  2. ESA 控制台配置 KeyServer 地址

  3. 上传 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;
    }
}

关键配置说明:

配置项

说明

listen

KeyServer 监听的端口,默认为 8443,支持 SSL

ssl_certificate

通信通道使用的 TLS 证书文件路径

ssl_certificate_key

通信通道使用的 TLS 私钥文件路径

lurk_pkey_path

业务域名 SSL 证书的私钥文件存放目录。将需要托管的私钥文件放入此目录即可

lurk_keepalive_requests

单个长连接上允许的最大请求数

将您业务域名证书对应的私钥文件复制到 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 通信。

  1. ESA控制台选择站点管理,在站点列单击目标站点。

  2. 在左侧导航栏,选择 边缘证书

  3. KeyServer 面板中,点击 配置

    说明

    如果 配置 按钮置灰并提示“KeyServer 配置已达上限”,说明当前站点的 KeyServer 配置数量已达到套餐配额上限。

  4. 填写 KeyServer 配置表单:

    配置项

    说明

    是否必填

    示例

    名称

    KeyServer 的名称标识,最长 256 字符

    my-keyserver

    服务器地址

    KeyServer 服务器地址,支持 IP 或域名

    192.168.1.100

    服务器端口

    KeyServer 监听端口,范围 1~65535

    8443

    KeyServer认证

    开启后将强制认证 KeyServer 证书

    开启

    认证 CA

    PEM 格式 CA 证书,开启 KeyServer 认证时需要配置

    开启KeyServer认证后必填

    粘贴 PEM 格式内容

    KeyClient 证书

    PEM 格式客户端证书,用于与 KeyServer 双向认证

    粘贴 PEM 格式内容

    KeyClient 私钥

    PEM 格式客户端私钥,用于与 KeyServer 双向认证

    粘贴 PEM 格式内容

    说明

    认证 CA字段仅在KeyServer认证开关开启时显示。KeyClient 证书KeyClient 私钥字段始终显示,但为可选填项。

  5. 点击确定保存配置。

步骤三:上传 Keyless 证书并关联 KeyServer

完成 KeyServer 地址配置后,上传 SSL 证书(公钥)并将其与 KeyServer 关联。

  1. 在证书配置页面的证书管理面板中,点击 上传自定义证书

  2. 在证书来源中选择 Keyless 证书

    说明

    Keyless 证书选项仅在 KeyServer 功能可用时显示。如果未看到该选项,请确认 KeyServer 开关已开启。

  3. 填写证书信息:

    配置项

    说明

    是否必填

    Keyless 证书

    从下拉列表中选择步骤二已配置好的 KeyServer

    证书名称

    自定义证书名称

    证书(公钥)

    粘贴 PEM 格式的证书公钥内容

    说明

    Keyless 证书不需要填写私钥,私钥由 KeyServer 管理。

  4. 点击确定,完成 Keyless 证书的配置。

配置完成后,证书列表中将显示该 Keyless 证书,类型显示为Keyless 证书

验证配置

完成 Keyless 证书配置后,通过以下方式验证配置是否生效:

  1. 使用 curl 命令测试 HTTPS 握手:

    curl -vI https://your-domain.com

    预期输出中包含 SSL certificate verify ok,且证书颁发者与实际证书一致。

  2. ESA 控制台的证书管理列表中,查看该证书的状态是否为正常

常见失败场景

失败场景

排查建议

KeyServer 端口不通

检查 KeyServer 服务器是否运行正常,防火墙是否放行了 KeyServer 端口,确保 ESA 边缘节点可公网访问该端口

证书链不完整

确保证书公钥文件包含完整的证书链(服务器证书 + 中间证书),可联系证书颁发机构获取完整链文件

KeyServer 签名超时

检查 KeyServer 服务器负载是否正常,确认网络延迟在可接受范围内

不同套餐的支持情况

当前该功能仅支持企业版套餐使用。

常见问题

Keyless 证书是否会影响 HTTPS 性能?

会有轻微影响。由于 TLS 握手过程中需要额外与 KeyServer 通信一次,首次连接的握手时间会增加一个 RTT(往返时间)。但握手完成后,后续的数据传输完全使用对称加密,与普通证书没有性能差异。建议将 KeyServer 部署在网络延迟较低的区域以减少影响。

KeyServer 宕机会有什么影响?

如果 KeyServer 不可用,新的 TLS 连接将无法建立,已有的连接不受影响(因为会话密钥已经协商完成)。建议对 KeyServer 进行高可用部署,例如通过负载均衡配置多台 KeyServer 实例。

是否支持 RSA 和 ECC 两种证书类型?

KeyServer 支持 RSA 和 ECC 两种密钥类型。只需将对应的私钥文件放入 lurk_pkey_path 指定的目录即可。

通信通道证书可以使用自签名证书吗?

可以。ESA 边缘节点与 KeyServer 之间的通信通道证书支持自签名证书,您在步骤一中生成的自签名证书即可满足要求。