Hyperledger Fabric
Pré-requisitos
O S.O. onde vai ser feita a integração via PKCS#11 deve ser compatível com as bibliotecas do HSM.
Como o default do Fabric é usar o Alpine Linux é preciso alterar o dockerfile para usar um S.O. compatível.
Versões
Este procedimento foi feito com a versão abaixo do Hyperledger Fabric, no WSL 2 do Windows 11
Componente Versão fabric-ca (server/client)
1.5.5
fabric-tool
2.4.7
fabric-peer
2.4.7
fabric-orderer
2.4.7
S.O. base
Ubuntu 20.04 sobre WSL2 no Windows 11
S.O. containers
Ubuntu 22.04 (jammy)
Go
1.20
Client HSM
4.7.35
Firmware HSM
5.0.28.0-243-g5a9cb01
Setup Inicial sem PKCS#11
Seguir o procedimento descrito em Fabric test network. No item Getting started guide configurar apenas os seguintes tópicos:
Inicie uma test network do zero a cada execução. Se o ambiente não estiver limpo, erros irão ocorrer em diversos pontos da subida da test network.
Monitore os logs e outputs dos containers da test network. Os logs do client do HSM podem ser vistos aqui, quando ligados com a opção de
stdout
:
Integração com o HSM via PKCS#11
Nos exemplos da integração a seguir são utilizados usuários/partições de HSM independentes para cada componente/organização.
Componente Nome de usuário Observações Onde é usado Teste de integração do
fabric-ca-client
caclient
Usado no teste de integração do
fabric-ca-client
.host
Fabric-ca
ca1
CA da organização 1
container
Fabric-ca
ca2
CA da organização 2
container
Fabric-ca
caorderer
CA do orderer
container
Peer 1
peer1
Peer da organização 1
container
Peer 2
peer2
Peer da organização 2
container
Setup inicial
É necessário seguir os passos da seção Setup Inicial sem PKCS#11 antes de prosseguir.
Executado em um Ubuntu 20.04 no WSL2 do Windows 11.
Definir a variável de ambiente
GOPATH
com o diretório de trabalho, neste caso usaremos~/go
. Pode-se definir no arquivo~/.profile
para facilitar o uso.
Recompilar as ferramentas do fabric e fabric-ca com suporte à PKCS#11
Criar pastas do Hyperledger e clonar repositório do
fabric-ca
.Compilar os binários do
fabric-ca
efabric-ca-client
com suporte à PKCS#11.Os binários são gerados na pasta
fabric-ca/bin
.Copiar os binários
fabric-ca
efabric-ca-client
para a pastafabric-samples/bin
.Clonar repositório do
fabric
.Compilar os binários das
tools
com suporte à PKCS#11.Os binários são gerados na pasta
build/bin
.Copiar os binários gerados para a pasta
fabric-samples/bin
.
Integração com fabric-ca-client
Existe um teste de fabric-ca-client na pasta
./fabric-samples/hardware-security-module
.O arquivo,
./fabric-samples/hardware-security-module/README.md
pode servir de guia, mas precisa de adaptações.
Este teste pode ser executado da própria máquina, sem necessidade de um container. Neste caso foi executado em um Ubuntu 20.04 no WSL2 do Windows 11.
Para o teste precisamos alterar os códigos hard-coded.
./fabric-samples/hardware-security-module/ca-client-config/fabric-ca-client-config-template.yaml
Na opção
bccsp
, alterar os seguintes campos:Label
: Label do token P11. No caso da Dinamo é "Dinamo HSM".Pin
: Senha utilizada para fazer login na P11. Senha do usuário configurado na P11 Dinamo.
Não alterar o campo
Library
. O placeholder é sobrescrito pelo script de execução.Alterar o IP e usuário do HSM no script abaixo. Este script irá gerar o arquivo de configuração do fabric que será usado para fazer as chamadas do
fabric-ca-client
para gerar um novo usuário.Para executar o teste, faça as alterações e execute o script acima.
Confira se o usuário configurado em
test-p11-ca-client.sh
existe no HSM.Exemplo de saída
Integração com fabric-ca-server
Versões utilizadas:
Componente Versão S.O.
Ubuntu 22.04 (jammy)
Go
1.20
Client HSM
3.7.35-1
Para que o Hyperledger funcione com o HSM precisamos recompilar o container com as seguintes configurações:
Utilizar uma distro de linux com suporte ao cliente do HSM, neste exemplo usaremos Ubuntu;
Habilitar o suporte a PKCS#11.
Gerar imagem com suporte a PKCS#11
Alterar o
Dockerfile
para compilar executar com o Ubuntu e instalar o client do HSM. O arquivoDockerfile
está localizado na pasta$GOPATH/src/github.com/hyperledger/fabric-ca/images/fabric-ca
. Após as alterações, o arquivo deve ficar como o seguinte.Compilar a imagem do
fabric-ca
.
Configurar a test network
Alterar os arquivos de configuração
fabric-ca-server-config.yaml
de cada organização para que utilizem a PKCS#11 do HSM. Esses arquivos estão localizados nos caminhos abaixo:fabric-samples/test-network/organizations/fabric-ca/org1/fabric-ca-server-config.yaml
.fabric-samples/test-network/organizations/fabric-ca/org2/fabric-ca-server-config.yaml
.
Estas configurações também podem ser definidas por variáveis de ambiente como mostrado na documentação de HSM do Fabric.
Alterar a seção
bccsp
para os seguintes valores.Configurar as variáveis de ambiente do client do HSM no arquivo compose da ca
compose-ca.yaml
. Este arquivo se encontra emfabric-samples/test-network/compose/compose-ca.yaml
.Neste caso estamos configurando a CA da organização 1, incluir as variáveis de ambiente na sua respectiva seção, como abaixo.
Utilizar um usuário do HSM diferente para cada uma das CAs.
Subir a test network e executar um teste
Execute o script de teste.
Exemplo de saída do teste de básico de transferência
Verificar pelo log remoto do HSM que o usuário configurado (ex:
ca1
) foi utilizado corretamente.Verificar que as chaves foram criadas no usuário do teste.
Integração com o orderer, peer e tools (container)
O container tools é um container que tem as ferramentas básicas de interação com o HSM compiladas e executadas no próprio container. Alguns trechos dos scripts da test network intercalam chamadas às ferramentas compiladas localmente (na máquina local) e execuções destas ferramentas do container.
Gerar imagens com suporte a PKCS#11
Os Dockerfiles abaixo estão no path
$GOPATH/src/github.com/hyperledger/fabric/images/
.
Editar os arquivos
Dockerfile
do peer e do orderer para serem compilados com Ubuntu e com suporte à PKCS#11.Configurar o Dockerfile de tools para utilizar o client do HSM.
Compilar as imagens do peer, orderer e tools.
Configurar a test network
Criar os arquivos de configuração
fabric-ca-client-config.yaml
dos peers.Usar como base o arquivo de configuração gerado em
fabric-samples/test-network/organizations/peerOrganizations/org1.example.com/fabric-ca-client-config.yaml
efabric-samples/test-network/organizations/peerOrganizations/org2.example.com/fabric-ca-client-config.yaml
.Estes arquivos são temporários e gerados a cada execução. Eles são removidos ao parar a test-network. Eles podem ser gerados, iniciando o a test-network (mesmo que com erros). Para acelerar o processo de geração é possível parar com CTRL-C logo após a geração das identidades do
Peer2
ou logo ao iniciar a geração das identidades do Orderer.Criar uma pasta para cada organização com os nomes de
org1
eorg2
na pastafabric-samples/test-network
e fazer uma cópia do arquivofabric-ca-client-config.yaml
para a pasta da respectiva organização.Lembrar de parar o serviço com
./stop-fabric.sh
após a cópia dos arquivos, para finalizar corretamente a test-network.Alterar a seção
bccsp
com as configurações da PKCS#11, do arquivofabric-ca-client-config.yaml
de cada organização, como a seguir.Alterar a chave
bccsp
do o arquivo de configuração do orderer.Configurar as variáveis de ambiente do client do HSM no arquivo compose da ca
compose-ca.yaml
.Este arquivo se encontra no path
fabric-samples/test-network/compose/compose-ca.yaml
.Neste caso estamos configurando o orderer, incluir as variáveis na sua respectiva seção, como abaixo.
Utilizar um usuário do HSM diferente por orderer.
Adicionar as configurações do client do HSM para os peers, no arquivo
fabric-samples/test-network/compose/docker/docker-compose-test-net.yaml
.Adicionar as variáveis de ambiente de configuração do client do HSM para cada peer,
peer0.org1.example.com
epeer0.org2.example.com
, como no exemplo abaixo.Configurar a PKCS#11 no arquivo
fabric-samples/test-network/compose/compose-test-net.yaml
. Como no exemplo abaixo.Adicionar as configurações de client e habilitar PKCS#11 no arquivo
fabric-samples/test-network/network.sh
.Na função
createOrgs
incluir as configurações antes de cada chamada acreateOrg1
ecreateOrg2
, como a seguir.Criar uma pasta para cada organização com os nomes de
org1
eorg2
na pastafabric-samples/config
e fazer uma cópia do arquivocore.yaml
para a pasta da respectiva organização.Configurar as opções de PKCS#11, alterando a seção
bccsp
, como a seguir, nos seguintes arquivos:fabric-samples/test-network/compose/docker/peercfg/core.yaml
fabric-samples/config/org1/core.yaml
fabric-samples/config/org2/core.yaml
Alterar o script
fabric-samples/test-network/organizations/fabric-ca/registerEnroll.sh
para utilizar PKCS#11 e usar os arquivos de configuração necessários.Editar as funções
createOrg1
ecreateOrg2
, com as seguintes alterações:Adicionar no início da função, abaixo da linha (
export FABRIC_CA_CLIENT_HOME...
), o código abaixo para habilitar o PKCS#11.Copiar o arquivo de configuração que será utilizado.
Alterar o caminho do arquivo de configuração
fabric-ca-client-config.yaml
de acordo com a organização utilizada, ex.org1/fabric-ca-client-config.yaml
eorg2/fabric-ca-client-config.yaml
.
Utilizar o
BCCSP
em software para a geração de certificado TLS do peer.Atualmente o Fabric não suporta PKCS#11 para uso em TLS.
Selecionar o provedor em software logo antes de gerar o certificado TLS e habilitar novamente o PKCS#11 logo após a geração do certificado.
Adicionar a linha:
logo após a linha:
Adicionar a linha:
logo após a linha:
Alterar o arquivo
fabric-samples/test-network/scripts/createChannel.sh
com as configurações do client PKCS#11.Adicionar as configurações de PKCS#11 no início da função
createChannel
.Adicionar a seguinte linha no início da função
joinChannel
.Remover a seguinte linha no início da função
joinChannel
.Adicionar as configurações da PKCS#11 antes da chamada à função
createChannelGenesisBlock
.Adicionar a configuração do usuário e path para a configuração antes de cada chamada (
joinChannel
,setAnchorPeer
) relativa a uma organização.Exemplo, peer1, adicionar as seguintes linhas, antes da chamada a
joinChannel 1
.Exemplo, peer2, adicionar as seguintes linhas, antes da chamada a
joinChannel 2
, e assim sucessivamente.
Alterar o arquivo
fabric-samples/test-network/scripts/deployCC.sh
com as configurações de PKCS#11.No início do arquivo, logo após a impressão dos comandos em execução, por exemplo logo após a linha:
Sobrescrever a linha:
Com as seguintes configurações:
Adicionar a configuração de usuário PKCS#11 e configuração de acordo com cada chamada de função, referente a uma organização.
Exemplo, peer1, adicionar as linhas:
antes da linha:
Exemplo, peer2, adicionar as linhas:
antes da linha abaixo, e assim sucessivamente.
Adicionar as configurações de PKCS#11 no arquivo
fabric-samples/test-network/scripts/setAnchorPeer.sh
.Adicionar as linhas abaixo, logo antes da chamada a
createAnchorPeerUpdate
.A variável
$ORG
recebe o valor1
ou2
de acordo com a chamada. No nosso exemplo o usuário do peer da organização 1 é opeer1
e da organização 2peer2
. Essa construção de nome permitiu fazer a seleção automática do usuário.
Criar script de teste básico com suporte à PKCS#11
test-p11-basic-transfer.sh
. Configurar a PKCS#11 de acordo com cada organização.
Subir a test network e executar um teste
Para subir, executar os testes e depois parar a test net, use os seguintes scripts.
Last updated