使用 CACLI 恢复 CA

适用场景

CA 集群中所有 CA 实例处于不可用状态,可能的场景如所有实例同时更换了 CPU 等,CA 之间无法完成自动授权。此时需要 Admin 参与恢复 CA,执行 unseal 操作。

准备工作

准备项准备结果示例
确认管理门限,参与恢复的管理员管理门限为 2,参与恢复的管理员为 Admin1、Admin2
确认 CA 集群实例数量2
确认运维人员确认由运维人员 OP 协助完成恢复

操作步骤

操作步骤概述

1、OP 准备 CACLI 机器和环境

2、Admin 合作完成 CA unseal

3、OP 恢复集群中其他 CA 节点

4、OP 进行资源清理收尾工作

OP 准备 CACLI 机器和环境

1、OP 准备 CACLI1 、CACLI2、CACLI-OP 三台机器,分别用于 Admin1、Admin2、OP 执行 CACLI 命令,每个 Admin 使用各自的机器执行命令;OP 在所有机器上准备好 Docker 环境、smn-ca Docker 镜像

2、OP 根据《SMN CACLI 部署》文档分别在 CACLI1、CACLI2、CACLI-OP 机器上部署好 CACLI,并执行下面命令验证 CACLI 可正常使用,其中 CA_ADDR 环境变量中的 IP 设置为 CA Server1 的主机 IP,需要注意,镜像仓库地址 registry.docker.com/smn/smn-ca 应该修改为开发者内网仓库地址,smn-ca 版本 X.Y.Z 修改为当前使用或者最新的 ca 版本

$ docker run \
-it \
--rm \
--name mpcca-cli \
-e "CA_ADDR=http://CA Server1's IP:8090" \
-v /etc/sgx_default_qcnl.conf:/etc/sgx_default_qcnl.conf \
registry.gitlab.com/safeheron-mpc-node/smn/smn-ca:X.Y.Z \
cacli status

-------------------- Output Example --------------------
CA Status: Unauthorized
Seal Type: Shamir
Total Shares: 3
Threshold: 2
Version: 1.1.0
Root Key Hash: 1b06962e****5af01edf
MRENCLAVE: a9408284******23f5643
MRENCLAVE_SIG: business******de100

3、OP 准备必要的信息分别发送给两位 Admin,信息包括:

docker run \
-it \
--rm \
--name mpcca-cli \
-e "CA_ADDR=http://192.168.0.100:8090" \
-v /etc/sgx_default_qcnl.conf:/etc/sgx_default_qcnl.conf \
registry.docker.com/smn/smn-ca:1.1.0 \
cacli admin unseal --init

docker run \
-it \
--rm \
--name mpcca-cli \
-e "CA_ADDR=http://192.168.0.100:8090" \
-v /etc/sgx_default_qcnl.conf:/etc/sgx_default_qcnl.conf \
registry.docker.com/smn/smn-ca:1.1.0 \
cacli admin unseal --input --nonce=replace-me

Admin 合作完成 CA unseal

1、Admin1 登录 CACLI1 执行以下命令,启动 CA 恢复任务,执行命令后在提示处输入备份的授权密钥分片并回车,把命令输出的 CA Unseal Operation Nonce: 53ee44e3-1008-49c9-bde6-b8d0106e926d发送给 Admin2,并通知 Admin2 进行恢复 unseal 操作。

$ docker run \
-it \
--rm \
--name mpcca-cli \
-e "CA_ADDR=http://192.168.0.100:8090" \
-v /etc/sgx_default_qcnl.conf:/etc/sgx_default_qcnl.conf \
registry.gitlab.com/safeheron-mpc-node/smn/smn-ca:1.1.0 \
cacli admin unseal --init

-------------------- Input Tips ------------------------
Please input your unseal key(Input will be hidden, and type Enter to confirm input. The nonce of the current operation is 'a0c7a609-43b8-43cc-8ccc-165326584ce1'): <Unseal Key>

-------------------- Output Example --------------------
CA Unseal Operation Nonce: a0c7a609-43b8-43cc-8ccc-165326584ce1
Unseal Progress: 1/2
Unseal Result: unfinished

...

2、Admin2 登录 CACLI2 执行以下命令,执行命令后在提示处输入备份的授权密钥分片并回车,并确保输出的Unseal Result为 true。命令参数--nonce 的值为 Admin1 提供的 CA Unseal Operation Nonce

$ docker run \
-it \
--rm \
--name mpcca-cli \
-e "CA_ADDR=http://192.168.0.100:8090" \
-v /etc/sgx_default_qcnl.conf:/etc/sgx_default_qcnl.conf \
registry.gitlab.com/safeheron-mpc-node/smn/smn-ca:1.1.0 \
cacli admin unseal --input --nonce=a0c7a609-43b8-43cc-8ccc-165326584ce1

-------------------- Input Tips ------------------------
Please input your unseal key(Input will be hidden, and type Enter to confirm input. The nonce of the current operation is 'a0c7a609-43b8-43cc-8ccc-165326584ce1'): <Unseal Key>

-------------------- Output Example --------------------
CA Unseal Operation Nonce: a0c7a609-43b8-43cc-8ccc-165326584ce1
Unseal Progress: 2/2
Unseal Result: true

...

3、Admin2 执行命令后,如果输出Unseal Result为 true,则标识恢复成功,通知 OP 进入下个步骤。

OP 恢复集群中其他 CA 节点

1、OP 登录 CACLI-OP 执行以下命令,其中 CA_ADDR 环境变量中的 IP 设置为 CA Server1 的主机 IP,确认 CA Server1 恢复完成,即命令输出的CA Status为 Authorized

$ docker run \
-it \
--rm \
--name mpcca-cli \
-e "CA_ADDR=http://CA Server1's IP:8090" \
-v /etc/sgx_default_qcnl.conf:/etc/sgx_default_qcnl.conf \
registry.gitlab.com/safeheron-mpc-node/smn/smn-ca:1.1.0 \
cacli status

-------------------- Output Example --------------------
CA Status: Authorized
Seal Type: Shamir
Total Shares: 3
Threshold: 2
Version: 1.1.0
Root Key Hash: 1b06962e****5af01edf
MRENCLAVE: a9408284******23f5643
MRENCLAVE_SIG: business******de100

2、OP 确认 CA Server2 中 CA 配置文件中的AuthorizedCAUrl指向 CA Server1 的 IP 后,启动 CA 服务。

# 部署第二台 CA 时需要配置,第一台不需要此配置
[Authority]
AuthorizedCAUrl = 'http://CA Server1's IP:8090'

3、OP 在 CACLI-OP 终端执行以下命令,确认 CA Server2 初始化完成,即命令输出的CA Status为 Authorized。其中 CA_ADDR 环境变量中的 IP 设置为 CA Server2 的主机 IP

$ docker run \
-it \
--rm \
--name mpcca-cli \
-e "CA_ADDR=http://CA Server2's IP:8090" \
-v /etc/sgx_default_qcnl.conf:/etc/sgx_default_qcnl.conf \
registry.gitlab.com/safeheron-mpc-node/smn/smn-ca:1.0.0 \
cacli status

-------------------- Output Example --------------------
CA Status: Authorized
Seal Type: Shamir
Total Shares: 3
Threshold: 2
Version: 1.1.0
Root Key Hash: 1b06962e****5af01edf
MRENCLAVE: a9408284******23f5643
MRENCLAVE_SIG: business******de100

4、集群恢复完成。

OP 进行资源清理收尾工作

CACLI1、 CACLI2、CACLI-OP 主机中不保存任何数据,在以上所有操作执行完成后,即可释放主机资源。后续在需要时按需提供主机部署 CACLI 即可。