# 硬件加密使用指南
硬件加密设计链接:
[硬件加密设计](../tech/硬件加密.md)
## 功能介绍
1. CA服务根私钥硬件保护
2. 共识签名私钥硬件保护
3. SDK用户签名私钥硬件保护
4. 加密数据库对称密钥硬件保护
5. 支持国际标准算法:RSA、AES和ECDSA
6. 支持国密标准算法:SM2、SM4
## 启用硬件加密
### 配置项
硬件加密相关配置目前有两种配置方式,一种是配置文件方式,另一种是环境变量方式,如果同时配置,则优先使用配置文件设置的配置项。
注: 硬件加密的开关配置,目前仅支持配置文件配置,需要将enabled设置为true,并设置type为pkcs11或者sdf
### 配置文件方式
在chainmaker-go、sdk-go以及chainmaker-cryptogen的配置文件中,硬件加密相关的开关配置和加密机配置如下:
```yaml
pkcs11:
enabled: true # set true if enable pkcs11
type: pkcs11 # support pkcs11 and sdf
library: /usr/local/lib64/libpkcs11.so # path to the libxxx.so file of hsm
label: HSM # label for the slot to be used
password: 12345678 # password to logon the HSM
session_cache_size: 10 # size of HSM session cache, default 10
hash: "" # hash algorithm used to compute SKI, not used now
```
注: 当开启硬件加密并且type为sdf时,仅需配library和session_cache_size即可,其他配置默认不生效
### 环境变量方式
首先需要在配置文件中, 打开硬件加密开关配置,如下:
```yaml
pkcs11:
enabled: true # set true if enable pkcs11
type: pkcs11 # support pkcs11 and sdf
```
然后通过环境变量指定加密机相关的其他配置:
```sh
export HSM_LIB=/usr/local/lib64/libupkcs11.so # path to the libxxx.so file of hsm
export HSM_LABEL="HSM" # label for the slot to be used
export HSM_PASSWORD=12345678 # password to logon the HSM
export HSM_SESSION_CACHE_SIZE=10 #size of HSM session cache, default 10
export HSM_HASH="" # hash algorithm used to compute SKI, not used now
```
### 适配器插件配置
由于不同硬件密码机厂商在实现pkcs11和sdf标准上存在着细微差异,引入适配器插件的方式来进行屏蔽,目前长安链适配多家厂商密码机。
密码机适配器插件接口定义和实现参考:[硬件加密设计](../tech/硬件加密.md)
启用硬件加密后,同时需要设置密码机适配器插件,需要通过HSM_ADAPTER_LIB环境变量指定适配器插件链接库,如下:
```sh
export HSM_ADAPTER_LIB=/usr/local/lib64/hsm_adapter.so
```
如果用户进行了长安链版本升级,从v2.3.0之前版本升级到 >= v2.3.0版本,需要注意以下几点:
1. v2.3.0之前版本仅支持pkcs11配置方式
2. v2.3.0兼容之前版本,如果启用了硬件加密,需要配置选项type字段设置为pkcs11;设置HSM_ADAPTER_LIB环境变量,指定适配器插件链接库。
## 测试网络
### 测试网络部署架构
1. 首先在密码设备创建CA根私钥、sdk用户私钥以及节点共识私钥。
2. 通过chainmaker-cryptogen工具(以下统称cryptogen)的generate命令一键生成测试网络证书。
3. 使用密码机节点私钥和cryptogen生成的节点证书启动chainmaker区块链网络
4. sdk使用密码机用户私钥进行签名,并将交易发送给chainmaker网络
5. chainmaker网络节点使用用户证书对交易进行验签名,并执行交易
### cryptogen启用硬件加密
修改配置文件chainmaker-cryptogen/config/crypto_config_template.yml,增加或修改pkcs11相关配置:
```yaml
crypto_config:
- domain: chainmaker.org
host_name: wx-org
count: 4 # 如果为1,直接使用host_name,否则添加递增编号
pk_algo: sm2
ski_hash: sha256
#pkcs11配置,
pkcs11:
enabled: true #启用硬件加密(此处设置为true)
library: /usr/local/lib64/libpkcs11.so #密码机pkcs11连接库
label: HSM #密码机slot对应label
password: 12345678 #密码机登陆密码
session_cache_size: 10
hash: ""
# 其他配置(略)
```
新增/修改配置文件chainmaker-cryptogen/config/pkcs11_keys.yml,配置测试网各组织CA根、用户以及节点私钥KeyID,配置如下(以4组织,每个组织1个共识节点为例):
```yaml
pkcs11_keys:
- wx-org1.chainmaker.org: #组织1相关密钥KeyId,keyPwd
ca:
- 1,123456
node:
consensus:
- 2,123456
common:
- 3,123456
user:
admin:
- 4,123456
client:
- 5,123456
light:
- 6,123456
- wx-org2.chainmaker.org:
ca:
- 7,123456
node:
consensus:
- 8,123456
common:
- 9,123456
user:
admin:
- 10,123456
client:
- 11,123456
light:
- 12,123456
- wx-org3.chainmaker.org: #组织2相关密钥keyId,keyPwd
ca:
- 13,123456
node:
consensus:
- 14,123456
common:
- 15,123456
user:
admin:
- 16,123456
client:
- 17,123456
light:
- 18,123456
- wx-org4.chainmaker.org:
ca:
- 19,123456
node:
consensus:
- 20,123456
common:
- 21,123456
user:
admin:
- 22,123456
client:
- 23,123456
light:
- 24,123456
```
### 节点启用硬件加密
修改chainmaker节点配置模版chainmaker-go/config/config_tql/chainmaker.tpl,新增/修改pkcs11相关配置:
```yml
node:
type: full
org_id: {org_id}
priv_key_file: ../config/{org_path}/certs/{node_cert_path}.key
cert_file: ../config/{org_path}/certs/{node_cert_path}.crt
signer_cache_size: 1000
cert_cache_size: 1000
#pkcs11配置(配置项说明参考cryptogen)
pkcs11:
enabled: true
type: pkcs11 #支持pkcs11和sdf
library: /usr/local/lib64/libupkcs11.so
label: HSM
password: 12345678
session_cache_size: 10
hash: ""
```
### 本地启动chainmaker网络
参考 [自拉起服务](../instructions/自拉起服务.html)
参考 [多机部署](../instructions/多机部署.md)
### sdk启用硬件加密
修改sdk配置文件sdk_config.yaml, 新增/修改pkcs11相关配置如下:
```yml
nodes:
- # 节点地址,格式为:IP:端口:连接数
node_addr: "127.0.0.1:12301"
conn_cnt: 10
enable_tls: true
trust_root_paths:
- "./testdata/crypto-config/wx-org1.chainmaker.org/ca"
- "./testdata/crypto-config/wx-org2.chainmaker.org/ca"
# TLS hostname
tls_host_name: "chainmaker.org"
#pkcs11配置(配置说明参考cryptogen)
pkcs11:
enabled: true
type: pkcs11
library: /usr/local/lib64/libupkcs11.so
label: HSM
password: 12345678
session_cache_size: 10
hash: ""
```
sdk测试
参考 [命令行工具](../dev/命令行工具.md)
参考 [SDK](../dev/SDK.md)
## 推荐部署架构
### 部署架构图
说明:
1. CA使用单独密码设备
2. 客户端SDK使用单独密码设备
3. 节点使用一台或多台密码设别(根据组织结构和节点部署情况而定)
### 密码设备部署
密码设备服务商提供(详情略)