Docker Image
预编译的 Hyperledger Fabric Docker 镜像不支持使用 PKCS11。如果你使用 docker 部署 Fabric,你需要重新编译镜像并启用 PKCS11,编译命令如下:
bash
#到fabric工程目录下
make docker GO_TAGS=pkcs11
你需要确保 PKCS11 库可用,你可以在节点上安装它,也可以把它挂载到容器里。
配置
配置文件
下边是一个 BCCSP 部分的示例:
yaml
#############################################################################
# BCCSP (BlockChain Crypto Service Provider) section is used to select which
# crypto library implementation to use
#############################################################################
bccsp:
default: PKCS11
pkcs11:
Library: /etc/hyperledger/fabric/libsofthsm2.so
Pin: "71811222"
Label: fabric
hash: SHA2
security: 256
Immutable: false
环境变量
你也可以使用环境变量覆盖配置文件中相关字段。
fabric-ca-server
如果你使用 Fabric CA Server链接 HSM,你需要设置如下环境变量或者直接在CA服务器配置文件(fabric-ca-server-config.yaml)中设置相应的值
bash
SOFTHSM2_CONF=/etc/softhsm2.conf
FABRIC_CA_SERVER_BCCSP_DEFAULT=PKCS11
FABRIC_CA_SERVER_BCCSP_PKCS11_LIBRARY=/etc/hyperledger/fabric/libsofthsm2.so
FABRIC_CA_SERVER_BCCSP_PKCS11_PIN=71811222
FABRIC_CA_SERVER_BCCSP_PKCS11_LABEL=fabric
FABRIC_CA_SERVER_BCCSP_PKCS11_HASH=SHA2
FABRIC_CA_SERVER_BCCSP_PKCS11_SECURITY=256
fabric-ca-server 使用环境变量会报错 [FATAL] Initialization failure: Failed to get BCCSP with opts: Could not initialize BCCSP PKCS11: Invalid config. It must not be nil.
fabric-ca-client
如果你使用 Fabric CA Client链接 HSM
bash
SOFTHSM2_CONF=/etc/softhsm2.conf
FABRIC_CA_CLIENT_BCCSP_DEFAULT=PKCS11
FABRIC_CA_CLIENT_BCCSP_PKCS11_LIBRARY=/etc/hyperledger/fabric/libsofthsm2.so
FABRIC_CA_CLIENT_BCCSP_PKCS11_PIN=71811222
FABRIC_CA_CLIENT_BCCSP_PKCS11_LABEL=fabric
peer
如果您使用 Fabric peer 连接到 softhsm2,您可以设置以下环境变量或直接在 peer 配置文件中设置相应的值:
bash
SOFTHSM2_CONF=/etc/softhsm2.conf
CORE_PEER_BCCSP_DEFAULT=PKCS11
CORE_PEER_BCCSP_PKCS11_LIBRARY=/etc/hyperledger/fabric/libsofthsm2.so
CORE_PEER_BCCSP_PKCS11_PIN=71811222
CORE_PEER_BCCSP_PKCS11_LABEL=fabric
CORE_PEER_BCCSP_PKCS11_HASH=SHA2
CORE_PEERENERAL_BCCSP_PKCS11_SECURITY=256
orderer
如果您使用 Fabric orderer 连接到 softhsm2,您可以设置以下环境变量或直接在 orderer 配置文件中设置相应的值:
bash
SOFTHSM2_CONF=/etc/softhsm2.conf
ORDERER_GENERAL_BCCSP_DEFAULT=PKCS11
ORDERER_GENERAL_BCCSP_PKCS11_LIBRARY=/etc/hyperledger/fabric/libsofthsm2.so
ORDERER_GENERAL_BCCSP_PKCS11_PIN=71811222
ORDERER_GENERAL_BCCSP_PKCS11_LABEL=fabric
ORDERER_GENERAL_BCCSP_PKCS11_HASH=SHA2
ORDERER_GENERAL_BCCSP_PKCS11_SECURITY=256
Orderer 启动时会打印出的 config values:
bash
General.LocalMSPDir = "/var/hyperledger/orderer/msp"
General.LocalMSPID = "OrdererMSP"
General.BCCSP.ProviderName = "PKCS11"
General.BCCSP.SwOpts.SecLevel = 256
General.BCCSP.SwOpts.HashFamily = "SHA2"
General.BCCSP.SwOpts.Ephemeral = true
General.BCCSP.SwOpts.FileKeystore.KeyStorePath = ""
General.BCCSP.SwOpts.DummyKeystore =
General.BCCSP.SwOpts.InmemKeystore =
General.BCCSP.Pkcs11Opts.SecLevel = 256
General.BCCSP.Pkcs11Opts.HashFamily = "SHA2"
General.BCCSP.Pkcs11Opts.Ephemeral = false
General.BCCSP.Pkcs11Opts.Library = "/usr/local/lib/softhsm/libsofthsm2.so"
General.BCCSP.Pkcs11Opts.Label = "fabric"
General.BCCSP.Pkcs11Opts.Pin = "222222"
General.BCCSP.Pkcs11Opts.SoftVerify = false
General.BCCSP.Pkcs11Opts.Immutable = false
docker compose
修改 docker compose 配置文件的 volumes 部分来挂载 softhsm 库和配置文件
yaml
environment:
- SOFTHSM2_CONF=/etc/hyperledger/fabric/config.file
volumes:
- /home/softhsm/config.file:/etc/hyperledger/fabric/config.file
- /usr/local/Cellar/softhsm/2.1.0/lib/softhsm/libsofthsm2.so:/etc/hyperledger/fabric/libsofthsm2.so
设置一个使用 HSM 的网络
如果你使用 HSM 部署 Fabric 节点,你需要在 HSM 中生成私钥而不是在节点本地 MSP 目录的 keystore 目录中。MSP 的 keystore 目录置空。另外,Fabric 节点会使用 signcerts 目录中签名证书的主体密钥标识符(subject key identifier)来检索 HSM 中的私钥。根据你使用 Fabric CA(Certificate Authority)还是你自己的 CA 的情况,创建 MSP 目录的操作是不一样的。
使用带有 HSM 的 Fabric CA
你可以像 Peer 节点或者排序节点一样,通过修改配置文件让 Fabric CA 使用 HSM。因为你可以使用 Fabric CA 在 HSM 内部生成秘钥,所以创建本地 MSP 目录的过程就很简单。按照下边的步骤:
-
修改
bccspFabric CA 服务器配置文件的部分并指向您为 HSM 创建的Label和PIN。Fabric CA 服务器启动时,生成私钥并存储在 HSM 中。如果您不担心公开您的 CA 签名证书,您可以跳过此步骤,只为您的对等节点或排序节点配置 HSM,如后续步骤所述。 -
使用 Fabrci CA 客户端,用你的 CA 来注册 Peer 节点或者排序节点的身份。
-
在部署具有 HSM 支持的对等节点或排序节点之前,您需要通过将其私钥存储在 HSM 中来注册节点身份。编辑
bccspFabric CA 客户端配置文件的部分或使用关联的环境变量指向对等节点或排序节点的 HSM 配置。在 Fabric CA Client 配置文件中,将默认SW配置替换为PKCS11配置并为您自己的 HSM 提供值
然后,对于每个节点,通过针对您在步骤 2 中注册的节点身份进行注册,使用 Fabric CA 客户端生成对等节点或排序节点的 MSP 文件keystore夹。 enroll 命令使用的不是将私钥存储在关联 MSP的文件夹中节点的 HSM 以生成和存储对等节点或排序节点的私钥。该keystore文件夹保持为空。
- 要配置对等节点或排序节点以使用 HSM,类似地更新对等节点或排序节点
bccsp配置文件的部分以使用 PKCS11 并提供Label和PIN。此外,编辑mspConfigPath(对于对等节点)或LocalMSPDir(对于排序节点)的值以指向使用 Fabric CA 客户端在上一步中生成的 MSP 文件夹 。现在对等节点或排序节点已配置为使用 HSM,当您启动节点时,它将能够使用受 HSM 保护的私钥对交易进行签名和背书。
在你自己的 CA 上使用 HSM
如果你使用你自己的 CA 来部署 Fabric 组件,你可以按如下步骤使用 HSM:
-
配置您的 CA 以使用 PKCS11 与 HSM 通信并创建一个
Label和PIN. 然后使用您的 CA 为每个节点生成私钥和签名证书,私钥在 HSM 内部生成。 -
使用你的 CA 构建节点 MSP 目录。将第 1 步生成的签名证书放入
signcerts目录。你也可以让keystore目录为空。 -
要配置对等节点或排序节点以使用 HSM,类似地更新对等节点或排序节点
bccsp配置文件的部分以使用 PKCS11Label并提供和PIN。编辑mspConfigPath(对于对等节点)或LocalMSPDir(对于排序节点)的值以指向使用 Fabric CA 客户端在上一步中生成的 MSP 文件夹。现在对等节点或排序节点已配置为使用 HSM,当您启动该节点时,它将能够使用受 HSM 保护的私钥对交易进行签名和背书。
: 区块链知识系列
: 密码学系列
: 零知识证明系列
: 共识系列
: 公链调研系列
: BTC系列
: 以太坊系列
: EOS系列
: Filecoin系列
: 联盟链系列
: Fabric系列
: 智能合约系列
: Token系列