使用 CACLI 初始化 CA 集群

适用场景

开发者首次部署 SMN 产品套件时,需要首次部署 CA,此时需要运维和管理员一起参与,完成 CA 的初始化和 Unseal Keys 备份。

准备工作

在进行首次部署 CA 集群时,需要完成以下准备:

准备项准备结果示例
CA 集群实例个数2
确认管理员人员和管理门限确认 Admin1、Admin2、Admin3 三位管理员参与管理,管理门限 2/3
确认运维人员确认由运维人员 OP 运维和部署 CA 集群

操作步骤

操作步骤概述

1、OP 准备 CA 和 CACLI 机器和环境

2、Admin 合作完成 CA setup

3、OP 启动集群中其他 CA 节点

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

OP 准备 CA 和 CACLI 机器和环境

1、OP 准备 CA Server1 、CA Server2 两台机器,用于部署 SMN CA;准备 CACLI1 、CACLI2、CACLI3、CACLI-OP 四台机器,分别用于 Admin1、Admin2、Admin3、OP 执行 CACLI 命令,每个 Admin 使用各自的机器执行命令;OP 在所有机器上准备好 Docker 环境、smn-ca Docker 镜像

2、OP 根据《SMN CA 部署》文档在 CA Server1 主机上部署 CA,CA 配置文件中不要配置 AuthorizedCAUrl 配置项,启动 CA;在 CA Server2 主机上部署 CA,CA 配置文件中的AuthorizedCAUrl指向 CA Server1 的 IP,不要启动

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

3、OP 根据《SMN CACLI 部署》文档分别在 CACLI1、CACLI2、CACLI3 机器上部署好 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.docker.com/smn/smn-ca:X.Y.Z \
cacli status

-------------------- Output Example --------------------
CA Status: Uninitialized
Seal Type: Shamir
Total Shares: 0
Threshold: 0
Version: 1.1.0
Root Key Hash: -
MRENCLAVE: a9408284******23f5643
MRENCLAVE_SIG: business******de100

4、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 setup --key-shares=3 --key-threshold=2

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 setup --nonce=replace-me  --backup

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 setup --nonce=replace-me  --verify

Admin 合作完成 CA setup

1、Admin1 登录 CACLI1 执行以下命令,启动 CA 初始化任务,命令执行完成后,Admin1 妥善备份输出的授权密钥分片Unseal Key 并把CA Setup Operation Nonce: f5399a0b-5376-441e-8e4f-367c05a16567发送给 Admin2 和 Admin3,并通知 Admin2 和 Admin3 可以进行备份 Unseal Keys 操作。

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 setup --key-shares=3 --key-threshold=2

-------------------- Output Example --------------------
Seal Type: Shamir
CA Setup Operation Nonce: f5399a0b-5376-441e-8e4f-367c05a16567
Total Shares: 3
Threshold: 2
-> Backup Progress: 1/3
Backup Finished: false
Verify Progress: 0/3
Verify Success: unfinished

Unseal Key: uk1.EJ6Dso5LBZBqi5My2IDRw3T6mCU7TG6mMgbQ2ietd0Q=

...

2、Admin2 登录 CACLI2 执行以下命令,备份输出的授权密钥分片Unseal Key。命令参数--nonce 的值为 Admin1 提供的 CA Setup 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.docker.com/smn/smn-ca:1.1.0 \
cacli admin setup --nonce=f5399a0b-5376-441e-8e4f-367c05a16567 --backup

-------------------- Output Example --------------------
Seal Type: Shamir
CA Setup Operation Nonce: f5399a0b-5376-441e-8e4f-367c05a16567
Total Shares: 3
Threshold: 2
-> Backup Progress: 2/3
Backup Finished: false
Verify Progress: 0/3
Verify Success: unfinished

Unseal Key: uk2.Eskn6fPlRH0r4ONQs2Lq0J9adl8aHtO/ykoXluNfS30=

...

3、Admin3 登录 CACLI3 执行以下命令,备份输出的授权密钥分片Unseal Key。命令参数--nonce 的值为 Admin1 提供的 CA Setup 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.docker.com/smn/smn-ca:1.1.0 \
cacli admin setup --nonce=f5399a0b-5376-441e-8e4f-367c05a16567 --backup

-------------------- Output Example --------------------
Seal Type: Shamir
CA Setup Operation Nonce: f5399a0b-5376-441e-8e4f-367c05a16567
Total Shares: 3
Threshold: 2
-> Backup Progress: 3/3
Backup Finished: true
Verify Progress: 0/3
Verify Success: unfinished

Unseal Key: uk3.FPPMIVl/g2ntNjNujkUD3cm6VJj48TjZYo1eU58RH7Y=

...

Backup Finishedtrue时,表明三位管理员各自备份了一片密钥分片,即 Unseal Key,但 CA 初始化尚未完成。为了确保备份的正确性,管理员需要对密钥分片进行验证,验证完成后,CA 达到可用状态。下面说明如何验证备份的密钥分片。

4、Admin1 登录 CACLI1 执行以下命令,命令参数--nonce 的值为CA Setup Operation Nonce,根据提示输入备份的授权密钥分片回车进行验证,并通知 Admin2 和 Admin3 可以进行验证 Unseal Keys 操作。

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 setup --nonce=f5399a0b-5376-441e-8e4f-367c05a16567 --verify

-------------------- Input Tips ------------------------
Please input your unseal key(Input will be hidden, and type Enter to confirm input. The nonce of the current operation is 'f5399a0b-5376-441e-8e4f-367c05a16567'): <Unseal Key>

-------------------- Output Example --------------------
Seal Type: Shamir
CA Setup Operation Nonce: f5399a0b-5376-441e-8e4f-367c05a16567
Total Shares: 3
Threshold: 2
Backup Progress: 3/3
Backup Finished: true
-> Verify Progress: 1/3
Verify Success: unfinished
...

5、Admin2 登录 CACLI2 执行以下命令,并根据提示输入授权密钥分片Unseal Key进行验证。命令参数--nonce 的值为 Admin1 提供的 CA Setup 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.docker.com/smn/smn-ca:1.1.0 \
cacli admin setup --nonce=f5399a0b-5376-441e-8e4f-367c05a16567 --verify

-------------------- Input Tips ------------------------
Please input your unseal key(Input will be hidden, and type Enter to confirm input. The nonce of the current operation is 'f5399a0b-5376-441e-8e4f-367c05a16567'): <Unseal Key>

-------------------- Output Example --------------------
Seal Type: Shamir
CA Setup Operation Nonce: f5399a0b-5376-441e-8e4f-367c05a16567
Total Shares: 3
Threshold: 2
Backup Progress: 3/3
Backup Finished: true
-> Verify Progress: 2/3
Verify Success: unfinished
...

6、Admin3 登录 CACLI3 执行以下命令,并根据提示输入授权密钥分片Unseal Key进行验证。命令参数--nonce 的值为 Admin1 提供的 CA Setup 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.docker.com/smn/smn-ca:1.1.0 \
cacli admin setup --nonce=f5399a0b-5376-441e-8e4f-367c05a16567 --verify

-------------------- Input Tips ------------------------
Please input your unseal key(Input will be hidden, and type Enter to confirm input. The nonce of the current operation is 'f5399a0b-5376-441e-8e4f-367c05a16567'): <Unseal Key>

-------------------- Output Example --------------------
Seal Type: Shamir
CA Setup Operation Nonce: f5399a0b-5376-441e-8e4f-367c05a16567
Total Shares: 3
Threshold: 2
Backup Progress: 3/3
Backup Finished: true
-> Verify Progress: 3/3
Verify Success: true

...

Verify Successtrue时,表明三位管理员均已完成 setup 操作并妥善备份 Unseal Key,且已经验证了备份的 Unseal Key 正确无误,至此,代表初始化授权已经完成,即 CA 可向其他 TEE 应用提供自动授权服务。通知 OP 进入下个步骤。

OP 启动集群中其他 CA 节点

1、检查 CA Server1 中的 CA 状态,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 并检查状态,OP 在 CACLI-OP 终端执行以下命令,其中 CA_ADDR 环境变量中的 IP 设置为 CA Server2 的主机 IP,确认 CA Server2 初始化完成,即命令输出的CA Status为 Authorized。

$ 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.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

至此 CA 集群初始化完成。

OP 进行资源清理收尾工作

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