# 部署启用硬件加密的链
本章节将介绍“长安链·ChainMaker”配置连接硬件加密机的运行过程。
## 启用硬件加密验证的测试网络架构
典型的硬件加密测试网络包含三个组成部分:
1. 使用硬件加密的证书颁发机构(cryptogen)
2. 使用硬件加密的区块链节点(chainmaker)
3. 使用硬件加密的sdk应用端(sdk)
## 配置流程简介
2.3.0版本的chainmaker的硬件加密支持两种标准:pkcs11和sdf(以下配置项统一以pkcs11配置为例,sdf参考配置说明)。
假设cryptogen和chainmaker的4个节点在一台服务器,sdk在另一台服务器,他们连接同一台硬件加密机,构建硬件加密环境的部署流程如图:
## 连接硬件加密机的配置
前置条件:已经存在某厂商(本文示例中使用三未信安)提供的硬件加密机,在其提供的配置服务中,添加好对应的密钥(以SM2密钥为例):
### 下载硬件加密相关的配置文件
以三未信安的密码机为例,需要以下文件:
- libswsds.so swsds.ini 密码机连接库
- libupkcs11.so upkcs11.ini 密码机pkcs11库
### 配置硬件加密机所在的ip,端口号以及密码:
```sh
vim swsds.ini
[HSM1]
ip=192.168.1.240
port=8000
passwd=xxxxxxxxxxxxxxxxxxxxxxxx
```
### 部署连接环境
1. 将libswsds.so和libupkcs11.so 拷贝到/usr/local/lib64/pkcs11目录下
2. 将swsds.ini和upkcs11.ini 拷贝到/etc/目录下
## 配置生成证书时使用硬件加密
### 方式一:使用chainmaker-cryptogen生成证书(支持sdf)
关于chainmaker-cryptogen的使用,参考:[通过命令行工具启动链](../recovery/通过命令行工具启动链.md)
1. 配置chainmaker-cryptogen/config/crypto_config_template.yml
```yaml
pk_algo: SM2
ski_hash: SM3
tls_mode: 0 # 0:单证书模式,1:双证书模式(国密tls标准需要双证书)
#pkcs11配置
pkcs11:
enabled: true
type: sdf
#type: pkcs11 #support sdf | pkcs11
library: /usr/local/lib64/pkcs11/libswsds.so
label: Sansec HSM
password: 11111111
session_cache_size: 10
hash: "SHA256" # hash algorithm used to compute SKI
```
**配置说明:**
- 使用非国密示例:
```yaml
pk_algo: ecc_p256
ski_hash: sha256
```
- 使用国密示例:
```yaml
pk_algo: SM2
ski_hash: SM3
```
- 开启硬件加密:
```yaml
pkcs11:
enabled: true
```
- 配置不同的硬件加密标准:
```yaml
type: pkcs11 #国际标准
# 或
type: sdf # 国内标准
```
- 配置library
```yaml
library: /usr/local/lib64/pkcs11/libupkcs11.so #pkcs11
library: /usr/local/lib64/pkcs11/libswsds.so #sdf
```
2. 配置密码机私钥
三未信安的密码机针对每种密钥有通用的前缀,例如SM2SignKey,RSASignKey,RSAEncKey等,前缀加上管理台的索引就是密钥的id
将密码机中配置的密钥id填写到配置文件chainmaker-cryptogen/config/pkcs11_keys.yml 中:
- 在2.3.0版本,pkcs11_keys.yml的配置如下:
```yaml
pkcs11_keys:
- wx-org1.chainmaker.org:
ca:
consensus:
- 2,123456
- 3,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
- 9,123456
common:
- 9,123456
user:
admin:
- 10,123456
client:
- 11,123456
light:
- 12,123456
- wx-org3.chainmaker.org:
ca:
- 13,123456
node:
consensus:
- 14,1234561
- 15,1234562
common:
- 15,123456
user:
admin:
- 16,123456
client:
- 17,123456
light:
- 18,123456
- wx-org4.chainmaker.org:
ca:
- 19,123456
node:
consensus:
- 20,123456
- 21,123456
common:
- 21,123456
user:
admin:
- 22,123456
client:
- 23,123456
light:
- 24,123456
```
- 在2.2.0及以前的版本,前辍SM2SignKey被配置在pkcs11_keys.yml文件中, pkcs11_keys.yml的配置如下:
```yaml
pkcs11_keys:
- wx-org1.chainmaker.org:
ca:
- SM2SignKey1
node:
consensus:
- SM2SignKey2
common:
- SM2SignKey3
user:
admin:
- SM2SignKey4
client:
- SM2SignKey5
light:
- SM2SignKey6
- wx-org2.chainmaker.org:
ca:
- SM2SignKey7
node:
consensus:
- SM2SignKey8
common:
- SM2SignKey9
user:
admin:
- SM2SignKey10
client:
- SM2SignKey11
light:
- SM2SignKey12
- wx-org3.chainmaker.org:
ca:
- SM2SignKey13
node:
consensus:
- SM2SignKey14
common:
- SM2SignKey15
user:
admin:
- SM2SignKey16
client:
- SM2SignKey17
light:
- SM2SignKey18
- wx-org4.chainmaker.org:
ca:
- SM2SignKey19
node:
consensus:
- SM2SignKey20
common:
- SM2SignKey21
user:
admin:
- SM2SignKey22
client:
- SM2SignKey23
light:
- SM2SignKey24
```
### 方式二:使用chainmaker-ca生成证书(暂不支持sdf)
关于chainmaker-ca的使用,参考:[CA证书服务](../tech/CA证书服务.md)
1. 配置启用硬件加密
```yaml
hash_type: SM3
key_type: SM2 # SHA256/SHA3_256/SM3
###....
###其他配置项省略
###....
pkcs11_config:
enabled: true
library: /usr/local/lib64/pkcs11/libupkcs11.so
label: HSM
password: 11111111
session_cache_size: 10
hash: "SHA256"
```
2. 私钥配置(目前用户证书不支持硬件加密,只有CA证书支持硬件加密)
```yaml
intermediate_config:
- csr:
CN: ca-wx-org1.chainmaker.org
O: wx-org1.chainmaker.org
OU: ca
country: CN
locality: Beijing
province: Beijing
key_id: SM2SignKey2
- csr:
CN: ca-wx-org2.chainmaker.org
O: wx-org2.chainmaker.org
OU: ca
country: CN
locality: Beijing
province: Beijing
key_id: SM2SignKey3
- csr:
CN: ca-wx-org3.chainmaker.org
O: wx-org3.chainmaker.org
OU: ca
country: CN
locality: Beijing
province: Beijing
key_id: SM2SignKey14
- csr:
CN: ca-wx-org4.chainmaker.org
O: wx-org4.chainmaker.org
OU: ca
country: CN
locality: Beijing
province: Beijing
key_id: SM2SignKey15
```
## 节点启用硬件加密
### 修改节点配置模板文件:
chainmaker-go/config/config_tql/chainmaker.tpl
```yaml
pkcs11:
enabled: true
type: pkcs11 #支持pkcs11和sdf
library: /usr/local/lib64/libupkcs11.so
label: Sansec HSM
password: 12345678
session_cache_size: 10
hash: ""
```
### 使用命令行方式构建链,并启动4个节点
参考:[通过命令行工具启动链](../recovery/通过命令行工具启动链.md)
## 应用端(sdk)启用硬件加密:
修改sdk_config.yml:
```yaml
#pkcs11配置(配置说明参考cryptogen)
pkcs11:
enabled: true
type: pkcs11
library: /usr/local/lib64/libupkcs11.so
label: HSM
password: 12345678
session_cache_size: 10
hash: ""
```
## 配置环境变量
在2.3.0之后,chainmaker的密码机环境提供了配置环境变量的方式:
1. 配置密码机连接的环境变量(必须)
```shell
export LD_LIBRARY_PATH=/usr/local/lib64/pkcs11
```
2. 加载适配器插件(必选)
下载适配器相关代码:
```shell
git clone --depth=1 https://git.chainmaker.org.cn/chainmaker/common.git
```
构建适配器:
```shell
cd common/crypto/hsm/swxa
./build.sh
```
将生成的sansec_hsm_adapter.so 复制到/usr/local/lib64下
```shell
cp sansec_hsm_adapter.so /usr/local/lib64sansec_hsm_adapter.so
export HSM_ADAPTER_LIB=/usr/local/lib64/sansec_hsm_adapter.so
```
3. 配置硬件加密选项(可选)
以下环境变量的配置与配置文件中的功能相同,二选一即可
Pkcs11:
```shell
export HSM_LIB=/usr/local/lib64/libupkcs11.so
export HSM_SESSION_CACHE_SIZE=10
export HSM_LABEL="Sansec HSM"
export HSM_PASSWORD=11111111
```
## 发送交易
完成以上配置,启动节点和sdk后,可以使用cmc命令以及sdk的方式向链上发送交易