SMN CA 部署
Safeheron MPC Node Certificate Authority (CA) 为基于 Intel SGX 保护的可信根密钥管理和授权服务,用于授权 SMN Service 中的可信应用以及横向授权其他 SMN CA 实例。为了方便开发者使用,SMN CA 也提供了一个命令行工具 cacli 来简化操作。SMN CA 集群通过使用一套数据库实例维护 SMN CA 集群状态,因此在部署 SMN CA 之前开发者需要准备好 MySQL 数据库。
交付物
| 交付物 | 说明 |
smn-ca:X.Y.Z | CA docker 镜像,其中包含 CA 服务以及 cacli 工具 |
| ca_config.toml | CA 配置文件模版 |
运行环境和依赖
| 类型 | 规格 | 说明 |
| Docker 运行环境 | 最小规格要求:2 CPU、4 G内存、20 G 存储,操作系统使用 Ubuntu 20.04 | 用于运行 SMN CA Docker 镜像,宿主机必须支持 Intel SGX 指令集 |
| MySQL 数据库 | 版本 ≥ 8.0 | 用于 SMN CA 集群间通信以及持久化数据,需要创建好数据库,准备好连接地址、账户和密码 |
Docker 宿主机环境
安装 Intel SGX 驱动
运行 SMN CA 的物理机器需要支持 Intel SGX 指令集,推荐使用阿里云安全增强通用型实例规格族 g7t 运行 SMN CA,操作系统使用 Ubuntu 20.04。创建完成机器后需要安装 Intel SGX 驱动:
apt update && apt install dkms -y
wget https://download.01.org/intel-sgx/sgx-linux/2.22/distro/ubuntu20.04-server/sgx_linux_x64_driver_1.41.bin
chmod +x sgx_linux_x64_driver_1.41.bin
./sgx_linux_x64_driver_1.41.bin检查驱动是否安装成功:
ls /dev | grep sgx
# 如果看到以下设备即安装成功
# sgx
# sgx_enclave
# sgx_provision远程认证配置文件
在阿里云服务器中生成 Intel SGX 可信应用远程认证时依赖的配置文件:
token=$(curl -s -X PUT -H "X-aliyun-ecs-metadata-token-ttl-seconds: 60" "http://100.100.100.200/latest/api/token")
region_id=$(curl -s -H "X-aliyun-ecs-metadata-token: $token" http://100.100.100.200/latest/meta-data/region-id)
PCCS_URL=https://sgx-dcap-server-vpc.${region_id}.aliyuncs.com/sgx/certification/v3/
cat > /etc/sgx_default_qcnl.conf << EOF
PCCS_URL=${PCCS_URL}
USE_SECURE_CERT=TRUE
EOF创建数据库
数据库的字符集 CHARSET 使用 utf8mb4,排序和比较规则 COLLATE 使用 utf8mb4_general_ci;开发者也可以使用以下 SQL 命令创建数据库:
CREATE DATABASE safeheron_mpc_node_ca CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;首次启动 CA 时会自动检测是否存在相关的数据表结构,如果不存在将会自动创建表结构,无需手动创建。
创建配置文件
我们在用户目录下准备一个文件夹 ca,在 ca 文件夹内创建 ca_config.toml:
cd ~
mkdir ca && cd ca
touch ca_config.tomlca_config.toml 配置文件内容如下,开发者需要修改其中和数据库相关配置:
[Server]
Port = 8090
# CA 数据库配置
[Database]
# CA 数据库地址,使用数据库 IP 或者域名
# 如 127.0.0.1 或者 name.rds.com
Host = 'URL'
# 数据库名称
Dbname = 'safeheron_mpc_node_ca'
# 数据库用户名,权限说明:create table, insert, select, update, delete
Username = 'username'
# 数据库密码
Password = 'password'
# 数据库端口
Port = '3306'
[Log]
# 日志级别,支持 Debug、Info、Warning、Error、Off 等级,其中 Off 为不输出日志
Level = 'Info'
Filepath = '/opt/logs'
# 部署第二台 CA 时需要配置,第一台不需要此配置
# [Authority]
# AuthorizedCAUrl = 'http://first_ca_ip:8090'使用 docker 启动
假设 ca_config.toml 配置文件在当前目录,在当前目录内使用以下命令启动 CA,日志存储在当前目录 logs 文件夹下:
cd ~/ca
docker run \
-d \
--rm \
--device /dev/sgx_enclave:/dev/sgx_enclave \
--device /dev/sgx_provision:/dev/sgx_provision \
-p 8090:8090 \
-v $(pwd)/ca_config.toml:/opt/safeheron/ca_config.toml \
-v $(pwd)/logs:/opt/logs \
-v $(pwd)/smn_ca:/root/.smn_ca \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/sgx_default_qcnl.conf:/etc/sgx_default_qcnl.conf \
--name ca \
smn-ca:X.Y.Z使用以下命令查看 SMN CA 日志输出:
tail -f logs/ca.log使用以下命令查看 SMN CA 是否正常启动,以及当前的授权状态,首次部署的 CA 状态应该为 Uninitialized :
curl 127.0.0.1:8090/check -v至此,已经部署完成 SMN CA,后续请参考 《SMN CA 使用指南》章节进行 CA 授权初始化和授权分片的备份,当授权完成第一个 CA 后按照横向扩容章节启动其他 CA 实例。
部署其他 SMN CA 实例
请在第一个 CA 完成授权后,再进行其他 CA 实例的部署。为了减轻 CA 管理员的工作负担,CA 其他实例部署不需要 CA 管理人员的参与, CA 的横向授权流程如下图所示:

在新的环境中按照上述流程安装 docker 环境、安装 Intel SGX 驱动、配置远程认证配置文件,然后在原有的配置文件基础上增加 AuthorizedCAUrl 配置项。同样地在用户目录下准备一个文件夹 ca,在 ca 文件夹内创建 ca_config.toml:
cd ~
mkdir ca && cd ca
touch ca_config.toml数据库相关的配置使用首次部署相同的数据库,所以不需要修改,增加 AuthorizedCAUrl 配置项,其内容为第一台完成授权的 CA 地址:
[Server]
Port = 8090
[Database]
Host = 'url'
Dbname = "safeheron_mpc_node_ca"
Username = "username"
Password = "password"
Port = "3306"
# 部署第二台 CA 时需要配置,第一台不需要此配置
[Authority]
AuthorizedCAUrl = "http://first_ca_ip:8090"
[Log]
Level = 'Info'
Filepath = '/opt/logs'然后使用相同的 docker 命令启动 CA 即可,通过 check 接口检查新部署的 CA 状态,预期为 Authorized。
更新 SMN CA 实例
CA 每次更新后由于 Intel SGX 的安全特性,其本地密封数据均不可用。因此更新的新版本 CA 需要向旧版本已经授权的 CA 请求授权。假设目前已经部署了多台 v1 版本的 CA,并且全部完成了授权:

需要选择其中一台 CA 先进行升级,被选中的 CA 在更新时需要修改其配置项中的 AuthorizedCAUrl 配置项,确保指向了一个工作状态正常且完成授权的 CA:

当第一个 v2 版本的 CA 更新完成,并且工作状态正常且完成授权,此时可以开始更新其他 CA 实例,类似部署其他 CA 实例,将需要更新的 CA 对应的配置文件中的 AuthorizedCAUrl 配置项指向更新完成的 CA,并逐个更新和检查工作状态:

在更新 SMN CA 前准备好需要更新的 smn-ca 镜像,更新流程为停止当前正在运行的 docker 容器,使用新镜像启动即可。停止当前运行的容器:
docker stop ca在包含配置文件 ca_config.toml 的文件夹中启动容器,注意,镜像 tag 使用需要更新的新镜像:
cd ~/ca
docker run \
-d \
--rm \
--device /dev/sgx_enclave:/dev/sgx_enclave \
--device /dev/sgx_provision:/dev/sgx_provision \
-p 8090:8090 \
-v $(pwd)/ca_config.toml:/opt/safeheron/ca_config.toml \
-v $(pwd)/logs:/opt/logs \
-v $(pwd)/smn_ca:/root/.smn_ca \
-v /etc/localtime:/etc/localtime:ro \
-v /etc/sgx_default_qcnl.conf:/etc/sgx_default_qcnl.conf \
--name ca \
smn-ca:X.Y.Z使用以下命令查看 SMN CA 日志输出:
tail -f logs/ca.log使用以下命令查看 SMN CA 是否正常启动,以及当前的授权状态,更新后的 CA 状态应该为 Authorized :
curl 127.0.0.1:8090/check -v高可用和扩容

SMN CA 的集群部署模式如上图所示,同一个 SMN CA 集群通过同一个 MySQL 维护 SMN CA 自身集群状态,因此只需要使用相同的配置启动多个 SMN CA,通过负载均衡器代理 SMN CA 服务即可,SMN Service 的配置文件中使用负载均衡器的访问地址。
SMN CA 通过部署多实例的方式提供高可用服务以及通过横向增加实例的方式进行扩容。在部署多个 SMN CA 实例时,这些实例必须都连接相同的 MySQL。
Load Balance 本身的高可用和扩容一般由云厂商 Load Balance 类产品或者成熟的负载均衡产品提供。MySQL 通过主从复制方式实现高可用,通过自身垂直扩容的方式实现扩容。