使用 Keyless 无私钥证书
通常,域名如果提供了 HTTPS 访问,则在服务端需要同时部署有证书的公钥、私钥才能完成握手过程中的通信加密和解密,如果您的域名需要接入 EdgeOne 进行安全加速,则也需要将证书的公钥、私钥都上传并部署在 EdgeOne 的边缘节点。如果您希望更严格地保存您的证书私钥,不希望将证书的私钥上传至腾讯云 SSL 控制台内,EdgeOne 支持 Keyless 无私钥证书部署方案,本文档将为您介绍如何使用 EdgeOne 的 Keyless 无私钥证书方案。
方案介绍
HTTPS 单向认证的握手流程(RSA 交换密钥算法为例)
正常情况下,如果在 EdgeOne 上配置了 HTTPS 证书,客户端使用 HTTPS 发起握手请求的流程如下(以使用 RSA 交换密钥算法为例):
1. 客户端向 EdgeOne 发起请求,将发送客户端 hello,并携带客户端生成的随机数以及支持的加密套件信息等发送给 EdgeOne;
2. EdgeOne 收到请求后,将在服务端也生成一个随机数,并将当前域名所配置的 HTTPS 证书公钥发送给客户端;
3. 客户端收到服务端随机数以及当前域名的公钥证书后,会通过 CA 证书对该证书进行验证,验证其有效并且可信任;
4. 确认证书验证通过后,客户端将根据当前加密算法生成一个预主密钥,并使用该证书内的公钥对预主密钥加密后发送给 EdgeOne;
5. EdgeOne 收到加密后的预主密钥,使用证书的私钥进行解密,获得预主密钥;
6. 此时服务端、客户端均具有完整的客户端随机数、服务端随机数以及预主密钥信息,将组合生成会话密钥,客户端和服务端均使用该会话密钥进行通信。
以上的加密通信会话的安全性在于服务端的证书私钥是安全的,如果服务端的证书私钥发生泄露,就有可能被攻击者利用导致会话信息泄露。
Keyless 无私钥证书方案中的握手流程(RSA 交换密钥算法为例)
EdgeOne 当前已支持了 Keyless 无私钥证书方案,为了进一步保障证书私钥的安全性,支持用户仅部署域名证书的公钥部分到 EdgeOne 边缘节点内,用户可以自行存储私钥部分,在需要使用私钥证书时,可向存储 keyless 服务端发起请求来使用私钥解密相关数据。与 HTTPS 单向认证握手的正常流程不一样的地方主要是在服务端收到加密后的预主密钥信息后,EdgeOne 将把该信息转发给 Keyless Server,由 Keyless Server 完成解密,并将解密后的预主密钥信息通过加密通信返回 EdgeOne。
说明:
准备工作
1. 准备一台用于安装 Keyless Server 的服务器,例如:
1.1.1.1
。2. 准备一个需要使用 Keyless 的域名,例如:
www.example.com
,该域名已完成接入 EdgeOne,该域名对应的证书为:server.crt
、server.key
。3. 准备好当前所需要配置的服务端证书,包括客户端公钥、私钥,证书名称例如是:
example.com.crt
、example.com.key
。注意:
自签名证书仅供测试使用,不受浏览器信任,不可应用于实际的业务中。
使用步骤
步骤一:在服务器上安装 Keyless Server 服务
1. 获取 keyless.tar.gz 安装包,请联系您的商务获取对应的安装包文件。
2. 将该安装包上传至当前准备的 Keyless Server 服务器中。
3. 将该安装包解压到指定的目录下,该目录用于安装 Keyless 服务,例如:
/test
。tar -xvzf keyless.tar.gz -C /test
4. 进入到安装的文件目录下。
cd /test/keyless
5. 运行以下命令,获取本机 IP 地址,例如:
172.16.64.24
。ifconfig -a
6. 上传用于存放当前域名对应的 Keyless 公钥和私钥证书,将该证书公钥、私钥文件都上传至
./ssl/
目录下;例如:server.crt
、server.key
。7. 上传用于 EdgeOne 边缘节点与 keyless server 之间握手所需要的服务端证书,将证书的公钥和私钥文件上传至
./ssl/mutual_ssl/example.com/
目录下,例如:example.com.crt
、example.com.key
。说明:
如果需要配置使用双向认证握手,也需要把客户端的 CA 证书上传至
./ssl/mutual_ssl/
目录下。配置完成后,您还需要配置 EdgeOne 边缘节点向keyless server 发起访问时所携带的客户端证书,该证书配置请 联系我们 进行配置。8. 修改配置文件
vim ./trpc_go.yaml
8.1 按 i 进入插入模式,可以开始编辑该配置文件,主要修改以下五个参数,其余参数保持默认即可:
IP:使用第 5 步中获取到的本机 IP 地址;
Port:对外提供的服务端口,推荐使用 443,需要保障该端口是可访问的;
tls_cert:第 6 步中上传的服务端证书的公钥路径;
tls_key:第 6 步中上传的服务端证书的私钥路径;
ca_cert:默认情况下,不需要配置。如果需要配置双向认证握手,该配置用于指定客户端证书的 CA 证书路径,即第 6 步中上传的客户端 CA 证书路径。
8.2 按 Esc 退出插入模式,然后输入
:wq
保存并退出。9. 运行以下命令,启用 keyless server 服务。
sudo nohup ./keyless &> log/output.log &ps -ef|grep keyless
10. 运行以下命令查看当前服务是否已启用成功,如果显示 launch success 即已经启用成功。
tail -f log/keyless.logll
步骤二:在腾讯云 SSL 证书控制台内上传证书
说明:
步骤三:在 EdgeOne 控制台内配置域名使用 Keyless 无私钥证书
1. 登录 边缘安全加速平台 EO 控制台,在左侧菜单栏中,单击站点列表,在站点列表内单击需配置的站点。
2. 在站点详情页面,单击域名服务 > 域名管理。
3. 找到需要配置的域名,在 HTTPS 配置一列,单击编辑,进入 HTTPS 配置页面,选择使用 Keyless 无私钥证书。
4. 配置 Keyless 服务端的地址,该地址即为 步骤一 您所准备的服务器地址与端口号。
5. 选择需要使用的 HTTPS 证书,该证书即为您在 步骤二 内所上传的证书。
6. 单击确定,等待配置部署下发,即可生效。
步骤四:验证访问
使用 curl 进行访问验证,查看 HTTPS 握手是否可访问成功。您可以参照以下 curl 指令:
curl https://www.example.com/ -v -k
更新 Keyless 证书
1. 登录 Keyless server 服务器,进入当前已安装的 keyless 目录内,将需要更新的公钥、私钥证书,上传至
./ssl/
目录下;注意:
Keyless 的公钥、私钥证书文件名必须保持一致,更新证书时,请勿直接覆盖旧的域名证书,建议另起一个文件名进行存放。例如:原证书名称是
server.crt
、server.key
,则新证书名字可以使用 server_new.crt
、server_new.key
。2. 上传完成后,执行以下命令重新加载 Keyless 证书;
curl http://127.0.0.1/KeylessReloadCerts -v
如果 curl 请求如下所示,响应 200,即加载成功:
3. 将当前需要更新的证书(仅包含公钥)上传到腾讯云 SSL 控制台内,步骤请参考:上传证书至腾讯云 SSL 控制台。
4. 登录 边缘安全加速平台 EO 控制台,在左侧菜单栏中,单击站点列表,在站点列表内单击需配置的站点。
5. 在站点详情页面,单击域名服务 > 域名管理。
6. 找到需要配置的域名,在 HTTPS 配置一列,单击编辑,进入 HTTPS 配置页面,选择使用 Keyless 无私钥证书。
7. 将 HTTPS 证书 修改为您新上传的证书,然后单击确定,等待配置部署下发,即可生效。