Ir al contenido

Tejido Hyperledger

Requisitos previos

  • El SO en el que se vaya a realizar la integración mediante PKCS#11 debe ser compatible con las librerías HSM.
  • Como Fabric utiliza por defecto Alpine Linux, es necesario cambiar el dockerfile para utilizar un sistema operativo compatible.

Versiones

  • Este procedimiento se realizó con la versión de Hyperledger Fabric que se indica a continuación, en WSL 2 de Windows 11

    Componente Versión
    fabric-ca (servidor/cliente) 1.5.5
    tela-herramienta 2.4.7
    tela-par 2.4.7
    ordenador de tejidos 2.4.7
    Base S.O. Ubuntu 20.04 sobre WSL2 en Windows 11
    Contenedores S.O. Ubuntu 22.04 (jammy)
    Vaya a 1.20
    Cliente HSM 4.7.35
    Firmware HSM 5.0.28.0-243-g5a9cb01

Configuración inicial sin PKCS#11

  1. Siga el procedimiento descrito en Fabric test network. En la Guía de inicio sólo configure los siguientes temas:

    1. Software necesario
    2. Instalar tejido y muestras de tejido
  2. Inicie una red de prueba desde cero cada vez que la ejecute. Si el entorno no está limpio, se producirán errores en varios puntos del ascenso de la red de prueba.

  3. Supervise los registros y salidas de los contenedores de red de prueba. Los registros del cliente HSM se pueden ver aquí, cuando se conecta con la opción stdout:

    HSM_LOG_DIR=stdout
    

Integración con HSM mediante PKCS#11

  • En los siguientes ejemplos de integración, se utilizan usuarios/particiones HSM independientes para cada componente/organización.

    Componente Nombre de usuario Observaciones Dónde se utiliza
    Prueba de integración Fabric-ca-client cacliente Utilizado en la prueba de integración fabric-ca-client. host
    Tela-ca ca1 Organización CA 1 contenedor
    Tela-ca ca2 Organización CA 2 contenedor
    Tela-ca caorderer CA del ordenante contenedor
    Par 1 par1 Par de la organización 1 contenedor
    Par 2 par2 Par de la organización 2 contenedor

Configuración inicial

  1. Debe seguir los pasos de la sección Configuración inicial sin PKCS#11 antes de continuar.

    Funcionando en un Ubuntu 20.04 sobre Windows 11 WSL2.

  2. Establece la variable de entorno GOPATH en el directorio de trabajo, en este caso usaremos ~/go. Puedes establecerla en el archivo ~/.profile para facilitar su uso.

    export GOPATH=$HOME/go
    

Recompilar las herramientas fabric y fabric-ca con soporte PKCS#11

  1. Crear carpetas Hyperledger y clonar el repositorio fabric-ca.

    cd $GOPATH
    mkdir -p src/github.com/hyperledger/
    cd src/github.com/hyperledger
    git clone -b v1.5.5 https://github.com/hyperledger/fabric-ca
    cd fabric-ca/
    
  2. Compilar los binarios fabric-ca y fabric-ca-client con soporte PKCS#11.

    make fabric-ca-server GO_TAGS=pkcs11
    make fabric-ca-client GO_TAGS=pkcs11
    

    Los binarios se generan en la carpeta fabric-ca/bin.

  3. Copie los binarios fabric-ca y fabric-ca-client en la carpeta fabric-samples/bin.

  4. Clonar repositorio de tejidos.

    cd $GOPATH/src/github.com/hyperledger
    git clone -b v2.4.7 https://github.com/hyperledger/fabric.git
    cd fabric
    
  5. Compilar los binarios de las herramientas con soporte PKCS#11.

    make tools GO_TAGS=pkcs11
    

    Los binarios se generan en la carpeta build/bin.

  6. Copie los binarios generados en la carpeta fabric-samples/bin.

Integración con fabric-ca-client

  • Hay una prueba fabric-ca-client en la carpeta ./fabric-samples/hardware-security-module.
  • El archivo, ./fabric-samples/hardware-security-module/README.md puede ser utilizado como guía, pero necesita ser adaptado.

Esta prueba se puede ejecutar desde la propia máquina, sin necesidad de un contenedor. En este caso, se ejecutó en un Ubuntu 20.04 sobre Windows 11 WSL2.

  1. Para la prueba tenemos que cambiar los códigos duros.

    ./fabric-samples/hardware-security-module/ca-client-config/fabric-ca-client-config-template.yaml

    En la opción bccsp, modifique los siguientes campos: - Etiqueta: Etiqueta del token P11. Dinamo En el caso de que sea "Dinamo HSM". - Pin: Contraseña utilizada para acceder al P11. Dinamo Contraseña del usuario configurado en el P11 .

    No cambie el campo Biblioteca. El marcador de posición es sobrescrito por el script de ejecución.

    #############################################################################
    # BCCSP (BlockChain Crypto Service Provider) section allows to select which
    # crypto implementation library to use
    #############################################################################
    bccsp:
        default: PKCS11
        PKCS11:
            Library: REPLACE_ME_HSMLIB
            Pin: 12345678
            Label: "Dinamo HSM"
            hash: SHA2
            security: 256
    
  2. Cambia la IP del HSM y el usuario en el script de abajo. Este script generará el archivo de configuración de fabric que se utilizará para realizar las llamadas fabric-ca-client para generar un nuevo usuario.

    #!/bin/bash
    
    #
    #   Test PKCS#11 CA client
    #
    
    # Add the path to the fabric-ca-client with pkcs11 support
    export PATH=./fabric-samples/bin:$PATH
    export PKCS11_LIB=/usr/lib/libtacndp11.so # path to the installed pkcs11
    
    # Dinamo pkcs11 configuration
    export DFENCE_PKCS11_IP=127.0.0.1     # HSM IP Address
    export DFENCE_PKCS11_USER=caclient  # HSM User
    export DFENCE_PKCS11_AUTO_RECONNECT=1
    #export HSM_LOG_DIR=./
    #export HSM_LOG_LEVEL=3
    
    ./fabric-samples/hardware-security-module/scripts/generate-hsm-user.sh HSMUser
    
  3. Para ejecutar la prueba, realice los cambios y ejecute el script anterior.

    Compruebe que el usuario configurado en test-p11-ca-client.sh existe en el HSM.

    ./start-fabric.sh
    ./test-p11-ca-client.sh
    ./stop-fabric.sh
    

    Muestra de resultados

    ./test-p11-ca-client.sh
    2022/11/24 19:06:08 [INFO] TLS Enabled
    2022/11/24 19:06:08 [INFO] generating key: &{A:ecdsa S:256}
    2022-11-24 19:06:08.860 -03 [bccsp_p11] generateECKey -> INFO 001 Generated new P11 key, SKI 80feb3f43df12ef5dae75a3dd3502092d702a8dd80e8fcb92335c41f54e372d0
    2022/11/24 19:06:08 [INFO] encoded CSR
    .
    .
    .
    

Integración con fabric-ca-server

  • Versiones utilizadas:

    Componente Versión
    S.O. Ubuntu 22.04 (jammy)
    Vaya a 1.20
    Cliente HSM 3.7.35-1
  • Para que Hyperledger funcione con HSM necesitamos recompilar el contenedor con la siguiente configuración:

    • Utiliza una distribución Linux que soporte el cliente HSM, en este ejemplo utilizaremos Ubuntu;
    • Activar la compatibilidad con PKCS#11.

Generar imagen compatible con PKCS#11

  1. Cambiar el Dockerfile para compilar ejecutar con Ubuntu e instalar el cliente HSM. El Dockerfile se encuentra en la carpeta $GOPATH/src/github.com/hyperledger/fabric-ca/images/fabric-ca. Después de hacer los cambios, el archivo debe tener este aspecto.

    #
    # Copyright IBM Corp. All Rights Reserved.
    #
    # SPDX-License-Identifier: Apache-2.0
    #
    ARG GO_VER
    
    FROM ubuntu:jammy
    ARG GO_LDFLAGS
    ARG GO_TAGS
    
    # Latest debian url of DINAMO client
    ENV HSM_CLIENT_URL "https://downloads.dinamonetworks.io/bin/client/linux/x64/4.7.35/dinamo-4.7.35-1.x64.deb"
    ENV GO_URL "https://storage.googleapis.com/golang/go1.19.3.linux-amd64.tar.gz"
    ENV DEBIAN_FRONTEND noninteractive
    
    RUN apt-get update -y && \
      apt-get install -y \
      apt-utils \
      gcc \
      binutils-gold \
      git \
      curl;
    
    RUN curl -L $GO_URL | tar -v -C /usr/local -xz
    
    ENV GOPATH /go
    RUN mkdir -p "$GOPATH/src" "$GOPATH/bin"
    ENV PATH $GOPATH/bin:/usr/local/go/bin:$PATH
    
    WORKDIR /tmp
    RUN curl -L $HSM_CLIENT_URL -o ./dinamo.deb
    RUN apt-get install -y ./dinamo.deb
    RUN rm ./dinamo.deb
    
    ADD . /build/fabric-ca
    WORKDIR /build/fabric-ca
    RUN go install -tags "${GO_TAGS}" -ldflags "${GO_LDFLAGS}" \
      github.com/hyperledger/fabric-ca/cmd/fabric-ca-server \
      && go install -tags "${GO_TAGS}" -ldflags "${GO_LDFLAGS}" \
      github.com/hyperledger/fabric-ca/cmd/fabric-ca-client
    
    RUN apt-get install -y \
      tzdata;
    ENV FABRIC_CA_HOME /etc/hyperledger/fabric-ca-server
    EXPOSE 7054
    CMD fabric-ca-server start -b admin:adminpw
    
  2. Compila la imagen fabric-ca.

    cd $GOPATH/src/github.com/hyperledger/fabric-ca
    export DOCKER_BUILDKIT=0
    export COMPOSE_DOCKER_CLI_BUILD=0
    make clean-all
    make docker GO_TAGS=pkcs11
    

Configuración de la red de prueba

  1. Cambie los archivos de configuración fabric-ca-server-config.yaml de cada organización para que utilicen el PKCS#11 del HSM. Estos archivos se encuentran en las siguientes rutas:

    • fabric-samples/test-network/organisations/fabric-ca/org1/fabric-ca-server-config.yaml.
    • fabric-samples/test-network/organisations/fabric-ca/org2/fabric-ca-server-config.yaml.


    Estos ajustes también pueden definirse mediante variables de entorno, como se muestra en la documentación de Fabric HSM.

  2. Cambie la sección bccsp por los siguientes valores.

    bccsp:
        default: PKCS11
        PKCS11:
            Library: /usr/lib/libtacndp11.so
            Pin: 12345678 # Senha do usuário do HSM
            Label: "Dinamo HSM"
            hash: SHA2
            security: 256
            Immutable: false
    
  3. Configure las variables de entorno del cliente HSM en el archivo ca compose compose-ca.yaml. Este archivo se encuentra en fabric-samples/test-network/compose/compose-ca.yaml.

    En este caso, estamos configurando la CA de organización 1En este caso, puede añadir las variables de entorno en su sección correspondiente, como se indica a continuación.

    Utilice un usuario HSM diferente para cada una de las CA.

    services:
    
      ca_org1:
        ...
        environment:
          ...
          - DFENCE_PKCS11_IP=host.docker.internal # IP do HSM
          - DFENCE_PKCS11_USER=ca1 # Usuário do HSM
          - DFENCE_PKCS11_AUTO_RECONNECT=1
    
      ...
    
      ca_org2:
        ...
        environment:
          ...
          - DFENCE_PKCS11_IP=host.docker.internal # IP do HSM
          - DFENCE_PKCS11_USER=ca2 # Usuário do HSM
          - DFENCE_PKCS11_AUTO_RECONNECT=1
    

Vaya a la red de prueba y ejecute una prueba

  1. Ejecute el script de prueba.

  2. Ejemplo de resultado de la prueba de transferencia básica

    ./test-basic-transfer.sh
    2022-11-14 18:32:53.487 -03 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200
    
    2022-11-14 18:32:56.826 -03 0001 INFO [chaincodeCmd] chaincodeInvokeOrQuery -> Chaincode invoke successful. result: status:200 payload:"Michel"
    {"AppraisedValue":800,"Color":"white","ID":"asset6","Owner":"Michel","Size":15}
    
  3. Compruebe a través del registro remoto del HSM que el usuario configurado (p. ej. ca1) se ha utilizado correctamente.

    2022/11/14 21:28:05 00000062 000000B7 995E9769 ca1/1d571851df3d6f v-attr update|172.17.0.1 172.17.0.2:4433 ca1
    2022/11/14 21:28:05 00000062 000000B8 995E9769 MANAGE_P11 (03:ca1/1d571851df3d6f) [00000000], c: 23|172.17.0.1 172.17.0.2:4433 ca1
    2022/11/14 21:28:05 00000062 000000B9 995E9769 172.17.0.1#23 probe|172.17.0.1 172.17.0.2:4433 ca1
    2022/11/14 21:28:05 00000062 000000BA 995E9769 ecc 1d571851df3d6f!0nMFd8VvAX80FxUQ7L+1Sh6eRZ6SSEJSJLuq6BasfL8=, c: 23|172.17.0.1 172.17.0.2:4433 ca1
    
  4. Compruebe que se han creado las claves en el usuario de prueba.

    Dinamo - Remote Management Console v. 4.7.34.0 2018 (c) Dinamo Networks
    
    HSM 127.0.0.1 e - Engine 5.0.28.0-243-g5a9cb01 (DXP) - TCA0000000  - ID ca1
    
    Keys/Objects - List
    
    
    Name                                      Type                 T E Label
    ================================================================================
    1d571851df3d6f                            prime256v1           n n e60bde44a80e532e20e5ac0952a093a4659e2736bca5b729a5708e6fbdfb8aee
    a8d9d38535ec9a                            prime256v1 pub       n y ea1f764edd0e8187409d61dfd78313d706b1b146fecb8a99b5f69309aced5de8
    d6f690620dee1a                            prime256v1           n n ea1f764edd0e8187409d61dfd78313d706b1b146fecb8a99b5f69309aced5de8
    d7ac2114025001                            prime256v1 pub       n y e60bde44a80e532e20e5ac0952a093a4659e2736bca5b729a5708e6fbdfb8aee
    
    Total of objects: 4
    

Integración con ordenantes, pares y herramientas (contenedor)

  • El contenedor de herramientas es un contenedor que tiene las herramientas básicas para interactuar con el HSM compiladas y ejecutadas en el propio contenedor. Algunas partes de los scripts de la red de pruebas intercalan llamadas a herramientas compiladas localmente (en la máquina local) y ejecuciones de estas herramientas desde el contenedor.

Generar imágenes compatibles con PKCS#11

Los Dockerfiles de abajo están en la ruta $GOPATH/src/github.com/hyperledger/fabric/images/.

  1. Edite los archivos Dockerfile del peer y ordenante para que sean compilados con Ubuntu y soporte PKCS#11.

    # Copyright IBM Corp. All Rights Reserved.
    #
    # SPDX-License-Identifier: Apache-2.0
    
    ARG GO_VER
    ARG ALPINE_VER
    
    FROM ubuntu:jammy as peer-base
    
    # Latest debian url of DINAMO client
    ENV HSM_CLIENT_URL "https://downloads.dinamonetworks.io/bin/client/linux/x64/4.7.35/dinamo-4.7.35-1.x64.deb"
    ENV DEBIAN_FRONTEND noninteractive
    
    RUN apt-get update -y && \
      apt-get install -y tzdata
    
    # Bugfix https://github.com/hyperledger/fabric/issues/3779
    RUN if [[ ! -e /etc/nsswitch.conf ]] ; then echo 'hosts: files dns' > /etc/nsswitch.conf ; fi
    
    RUN apt-get install -y \
      bash \
      binutils-gold \
      gcc \
      git \
      make \
      musl-dev \
      curl
    
    RUN curl -L $HSM_CLIENT_URL -o /tmp/dinamo.deb
    RUN apt-get install -y /tmp/dinamo.deb
    RUN rm /tmp/dinamo.deb
    
    FROM golang:latest as golang
    ADD . $GOPATH/src/github.com/hyperledger/fabric
    WORKDIR $GOPATH/src/github.com/hyperledger/fabric
    
    FROM golang as peer
    ARG GO_TAGS
    #Bugfix https://github.com/hyperledger/fabric/issues/3645
    RUN make peer GO_TAGS=${GO_TAGS}
    RUN make ccaasbuilder
    RUN \
        export MARCH=$(go env GOOS)-$(go env GOARCH) && \
        mkdir -p release/linux-platform && \
        cp -r release/${MARCH}/builders release/linux-platform/.
    
    FROM peer-base
    ENV FABRIC_CFG_PATH /etc/hyperledger/fabric
    VOLUME /etc/hyperledger/fabric
    VOLUME /var/hyperledger
    COPY --from=peer /go/src/github.com/hyperledger/fabric/build/bin /usr/local/bin
    COPY --from=peer /go/src/github.com/hyperledger/fabric/sampleconfig/msp ${FABRIC_CFG_PATH}/msp
    COPY --from=peer /go/src/github.com/hyperledger/fabric/sampleconfig/core.yaml ${FABRIC_CFG_PATH}/core.yaml
    COPY --from=peer /go/src/github.com/hyperledger/fabric/release/linux-platform/builders/ccaas/bin/ /opt/hyperledger/ccaas_builder/bin/
    EXPOSE 7051
    CMD ["peer","node","start"]
    
    # Copyright IBM Corp. All Rights Reserved.
    #
    # SPDX-License-Identifier: Apache-2.0
    
    ARG GO_VER
    ARG ALPINE_VER
    FROM ubuntu:jammy as base
    
    # Latest debian url of DINAMO client
    ENV HSM_CLIENT_URL "https://downloads.dinamonetworks.io/bin/client/linux/x64/4.7.35/dinamo-4.7.35-1.x64.deb"
    ENV GO_URL "https://storage.googleapis.com/golang/go1.19.3.linux-amd64.tar.gz"
    ENV DEBIAN_FRONTEND noninteractive
    
    RUN apt-get update -y && \
      apt-get install -y tzdata
    
    # Bugfix https://github.com/hyperledger/fabric/issues/3779
    RUN if [[ ! -e /etc/nsswitch.conf ]] ; then echo 'hosts: files dns' > /etc/nsswitch.conf ; fi
    
    RUN apt-get install -y \
      bash \
      binutils-gold \
      gcc \
      git \
      make \
      musl-dev \
      curl
    
    RUN curl -L $HSM_CLIENT_URL -o /tmp/dinamo.deb
    RUN apt-get install -y /tmp/dinamo.deb
    RUN rm /tmp/dinamo.deb
    
    FROM golang:latest as golang
    ADD . $GOPATH/src/github.com/hyperledger/fabric
    WORKDIR $GOPATH/src/github.com/hyperledger/fabric
    
    FROM golang as orderer
    ARG GO_TAGS
    #Bugfix https://github.com/hyperledger/fabric/issues/3645
    RUN make orderer GO_TAGS=${GO_TAGS}
    
    FROM base
    ENV FABRIC_CFG_PATH /etc/hyperledger/fabric
    VOLUME /etc/hyperledger/fabric
    VOLUME /var/hyperledger
    COPY --from=orderer /go/src/github.com/hyperledger/fabric/build/bin /usr/local/bin
    COPY --from=orderer /go/src/github.com/hyperledger/fabric/sampleconfig/msp ${FABRIC_CFG_PATH}/msp
    COPY --from=orderer /go/src/github.com/hyperledger/fabric/sampleconfig/orderer.yaml ${FABRIC_CFG_PATH}
    COPY --from=orderer /go/src/github.com/hyperledger/fabric/sampleconfig/configtx.yaml ${FABRIC_CFG_PATH}
    EXPOSE 7050
    CMD ["orderer"]
    
  2. Configure el Dockerfile desde herramientas para utilizar el cliente HSM.

     # Copyright IBM Corp. All Rights Reserved.
     #
     # SPDX-License-Identifier: Apache-2.0
    
     ARG GO_VER
     ARG ALPINE_VER
    
     FROM golang:latest as tools
     ARG GO_TAGS
    
     ADD . $GOPATH/src/github.com/hyperledger/fabric
     WORKDIR $GOPATH/src/github.com/hyperledger/fabric
    
     #Bugfix https://github.com/hyperledger/fabric/issues/3645
     RUN make tools GO_TAGS=${GO_TAGS}
    
     FROM ubuntu:jammy
    
     # Latest debian url of DINAMO client
     ENV HSM_CLIENT_URL "https://downloads.dinamonetworks.io/bin/client/linux/x64/4.7.35/dinamo-4.7.35-1.x64.deb"
     ENV DEBIAN_FRONTEND noninteractive
    
     # git is required to support `go list -m`
     RUN apt-get update -y && \
       apt-get install -y \
       bash \
       binutils-gold \
       gcc \
       git \
       make \
       jq \
       tzdata \
       curl \
       musl-dev;
    
     RUN curl -L $HSM_CLIENT_URL -o /tmp/dinamo.deb
     RUN apt-get install -y /tmp/dinamo.deb
     RUN rm /tmp/dinamo.deb
    
     ENV FABRIC_CFG_PATH /etc/hyperledger/fabric
     VOLUME /etc/hyperledger/fabric
     COPY --from=tools /go/src/github.com/hyperledger/fabric/build/bin /usr/local/bin
     COPY --from=tools /go/src/github.com/hyperledger/fabric/sampleconfig ${FABRIC_CFG_PATH}
    
  3. Compilar el compañero, ordenante e herramientas.

    cd $GOPATH/src/github.com/hyperledger/fabric/
    make  clean-all
    make docker GO_TAGS=pkcs11
    

Configuración de la red de prueba

  1. Crear los archivos de configuración fabric-ca-client-config.yaml de los pares.

    Utilice el archivo de configuración generado en fabric-samples/test-network/organisations/peerOrganisations/org1 . example . com/fabric-ca-client-config .yaml y fabric-samples/test-network/organisations/peerOrganisations/org2.example.com/fabric-ca-client-config.yaml como base.

    Estos archivos son temporales y se generan con cada ejecución. Se eliminan cuando se detiene el test-network. Se pueden generar al iniciar el test-network (incluso con errores). Para acelerar el proceso de generación, puede detenerse con CTRL-C justo después de generar las identidades Peer2 o justo después de empezar a generar las identidades Orderer.

      ./start-fabric.sh
    
      /mnt/d/tmp/hyperledger/fabric-samples/test-network /mnt/d/tmp/hyperledger
      Using docker and docker-compose
      Creating channel 'mychannel'.
    
      ...
    
      Creating Orderer Org Identities
      Enrolling the CA admin
      + fabric-ca-client enroll -u https://admin:adminpw@localhost:9054 --caname ca-orderer --tls.certfiles /mnt/d/tmp/hyperledger/fabric-samples/test-network/organizations/fabric-ca/ordererOrg/tls-cert.pem
    
      >>> CTRL-C <<<
    
  2. Cree una carpeta para cada organización con los nombres org1 y org2 en la carpeta fabric-samples/test-network y haga una copia del archivo fabric-ca-client-config.yaml en la carpeta de la organización respectiva.

    cd fabric-samples/test-network
    mkdir org1
    cp organizations/peerOrganizations/org1.example.com/fabric-ca-client-config.yaml org1
    mkdir org2
    cp organizations/peerOrganizations/org2.example.com/fabric-ca-client-config.yaml org2
    cd ../..
    ./stop-fabric.sh
    

    Recuerde detener el servicio con ./stop-fabric.sh después de copiar los archivos para finalizar la red de prueba correctamente.

  3. Cambie la sección bccsp con la configuración PKCS#11 en el archivo fabric-ca-client-config.yaml de cada organización como se indica a continuación.

    bccsp:
        default: PKCS11
        PKCS11:
            Library: /usr/lib/libtacndp11.so
            Pin: 12345678
            Label: "Dinamo HSM"
            hash: SHA2
            security: 256
            Immutable: false
    
  4. Cambiar la clave bccsp en el ordenante.

    bccsp:
        default: PKCS11
        PKCS11:
            Library: /usr/lib/libtacndp11.so
            Pin: 12345678
            Label: "Dinamo HSM"
            hash: SHA2
            security: 256
            Immutable: false
    
  5. Configure las variables de entorno del cliente HSM en el archivo ca compose compose-ca.yaml.

    Este archivo se encuentra en la ruta fabric-samples/test-network/compose/compose-ca.yaml.

    En este caso estamos configurando el ordenantepara incluir las variables en su sección correspondiente, como se indica a continuación.

    Utilizar un usuario HSM diferente para cada ordenante.

    services:
    
      ca_orderer:
        ...
        environment:
          ...
          - DFENCE_PKCS11_IP=host.docker.internal # IP do HSM
          - DFENCE_PKCS11_USER=caorderer               # Usuário do HSM
          - DFENCE_PKCS11_AUTO_RECONNECT=1
    
  6. Añade la configuración del cliente HSM para los paresen el archivo fabric-samples/test-network/compose/docker/docker-compose-test-net.yaml.

    Añada las variables de entorno de configuración del cliente HSM para cada peerpeer0.org1.ejemplo.com y peer0.org2.ejemplo.com, como en el ejemplo siguiente.

    services:
      peer0.org1.example.com:
        ...
        environment:
          ...
          - DFENCE_PKCS11_IP=host.docker.internal
          - DFENCE_PKCS11_USER=peer1
          - DFENCE_PKCS11_AUTO_RECONNECT=1
          ...
    peer0.org2.example.com:
        ...
        environment:
          ...
          - DFENCE_PKCS11_IP=host.docker.internal
          - DFENCE_PKCS11_USER=peer2
          - DFENCE_PKCS11_AUTO_RECONNECT=1
    
  7. Configure PKCS#11 en el archivo fabric-samples/test-network/compose/compose-test-net.yaml. Como en el ejemplo siguiente.

    services:
      peer0.org1.example.com:
        ...
        environment:
          ...
          - DFENCE_PKCS11_IP=host.docker.internal
          - DFENCE_PKCS11_USER=peer1
          - DFENCE_PKCS11_AUTO_RECONNECT=1
          ...
    peer0.org2.example.com:
        ...
        environment:
          ...
          - DFENCE_PKCS11_IP=host.docker.internal
          - DFENCE_PKCS11_USER=peer2
          - DFENCE_PKCS11_AUTO_RECONNECT=1
    
  8. Añada la configuración del cliente y habilite PKCS#11 en el archivo fabric-samples/test-network/network.sh.

    En la función createOrgs, incluya la configuración antes de cada llamada a createOrg1 y createOrg2, como se indica a continuación.

    .
    .
    .
    infoln "Creating Org1 Identities"
    
        export DFENCE_PKCS11_IP=127.0.0.1
        export DFENCE_PKCS11_USER=peer1
        export DFENCE_PKCS11_AUTO_RECONNECT=1
        export HSM_LOG_DIR=/mnt/d/tmp/hyperledger
        export HSM_LOG_LEVEL=3
        export FABRIC_CA_CLIENT_BCCSP_DEFAULT=PKCS11
        export FABRIC_CA_CLIENT_BCCSP_PKCS11_LIBRARY=/usr/lib/libtacndp11.so
        export FABRIC_CA_CLIENT_BCCSP_PKCS11_PIN=12345678
        export FABRIC_CA_CLIENT_BCCSP_PKCS11_LABEL="Dinamo HSM"
        export FABRIC_CA_CLIENT_BCCSP_PKCS11_IMMUTABLE=false
        export FABRIC_CA_CLIENT_BCCSP_PKCS11_HASH=SHA2
        export FABRIC_CA_CLIENT_BCCSP_PKCS11_SECURITY=256
    
        createOrg1
    
        infoln "Creating Org2 Identities"
    
        export DFENCE_PKCS11_USER=peer2
    
        createOrg2
    
        unset DFENCE_PKCS11_IP
        unset DFENCE_PKCS11_USER
        unset DFENCE_PKCS11_AUTO_RECONNECT
        unset HSM_LOG_DIR
        unset HSM_LOG_LEVEL
        unset FABRIC_CA_CLIENT_BCCSP_DEFAULT
        unset FABRIC_CA_CLIENT_BCCSP_PKCS11_LIBRARY
        unset FABRIC_CA_CLIENT_BCCSP_PKCS11_PIN
        unset FABRIC_CA_CLIENT_BCCSP_PKCS11_LABEL
        unset FABRIC_CA_CLIENT_BCCSP_PKCS11_IMMUTABLE
        unset FABRIC_CA_CLIENT_BCCSP_PKCS11_HASH
        unset FABRIC_CA_CLIENT_BCCSP_PKCS11_SECURITY
    .
    .
    .
    
  9. Cree una carpeta para cada organización con los nombres org1 y org2 en la carpeta fabric-samples/config y haga una copia del archivo core.yaml en la carpeta de la organización correspondiente.

    cd fabric-samples/config
    mkdir org1
    cp ../test-network/compose/docker/peercfg/core.yaml org1
    mkdir org2
    cp ../test-network/compose/docker/peercfg/core.yaml org2
    cd ../..
    
    1. Configure las opciones PKCS#11 cambiando la sección bccspen los siguientes archivos:

    • fabric-samples/test-network/compose/docker/peercfg/core.yaml
    • fabric-samples/config/org1/core.yaml
    • fabric-samples/config/org2/core.yaml
    .
    .
    .
     bccsp:
        default: PKCS11
        PKCS11:
            Library: /usr/lib/libtacndp11.so
            Pin: 12345678
            Label: "Dinamo HSM"
            hash: SHA2
            security: 256
            Immutable: false
    .
    .
    .
    
  10. Cambie el script fabric-samples/test-network/organisations/fabric-ca/registerEnroll.sh para utilizar PKCS#11 y utilice los archivos de configuración necesarios.

    1. Edita las funciones createOrg1 y createOrg2 con los siguientes cambios:

      1. Añada el siguiente código al principio de la función, debajo de la línea(export FABRIC_CA_CLIENT_HOME...), para habilitar PKCS#11.

      2. Copie el archivo de configuración que se utilizará.

      export FABRIC_CA_CLIENT_BCCSP_DEFAULT=PKCS11
      cp ${PWD}/org1/fabric-ca-client-config.yaml $FABRIC_CA_CLIENT_HOME
      

      Cambia la ruta del archivo de configuración fabric-ca-client-config.yaml según la organización utilizada, por ejemplo org1/fabric-ca-client-config.yaml y org2/fabric-ca-client-config.yaml.

    2. Utilizar BCCSP en software para generar el certificado TLS del par.

    Fabric no soporta actualmente PKCS#11 para su uso en TLS.

    Seleccione el proveedor en software justo antes de generar el certificado TLS y vuelva a activar PKCS#11 justo después de generar el certificado.

    1. Adicionar a linha:
       ```bash
       export FABRIC_CA_CLIENT_BCCSP_DEFAULT=SW
       ```
    
       logo após a linha:
    
       ```bash
       infoln "Generating the peer0-tls certificates"
       ```
    
    1. Adicionar a linha:
    
       ```bash
       export FABRIC_CA_CLIENT_BCCSP_DEFAULT=PKCS11
       ```
    
       logo após a linha:
    
       ```bash
       { set +x; } 2>/dev/null
       ```
    
  11. Cambie el archivo fabric-samples/test-network/scripts/createChannel.sh con la configuración del cliente PKCS#11.

    1. Añada la configuración PKCS#11 al inicio de la función createChannel.
    export DFENCE_PKCS11_IP=127.0.0.1
    export DFENCE_PKCS11_USER=peer1
    export DFENCE_PKCS11_AUTO_RECONNECT=1
    
    1. Añade la siguiente línea al principio de la función joinChannel.
    export FABRIC_CA_CLIENT_BCCSP_DEFAULT=PKCS11
    
    1. Elimina la siguiente línea al principio de la función joinChannel.

      FABRIC_CFG_PATH=$PWD/../config/
      

    2. Añada la configuración PKCS#11 antes de llamar a la función createChannelGenesisBlock.

    export DFENCE_PKCS11_IP=host.docker.internal
    export DFENCE_PKCS11_USER=peer1
    export DFENCE_PKCS11_AUTO_RECONNECT=1
    
    1. Añadir la configuración de usuario y la ruta a la configuración antes de cada llamada(joinChannel, setAnchorPeer) relativa a una organización.

    2. Ejemplo, peer1añade las siguientes líneas antes de la llamada a joinChannel 1.

      export DFENCE_PKCS11_USER=peer1
      FABRIC_CFG_PATH="${PWD}/../config/org1"
      
    3. Ejemplo, peer2añada las siguientes líneas antes de la llamada a joinChannel 2, y así sucesivamente.

      export DFENCE_PKCS11_USER=peer2
      FABRIC_CFG_PATH="${PWD}/../config/org2"
      
  12. Cambie el archivo fabric-samples/test-network/scripts/deployCC.sh con la configuración PKCS#11.

    1. Al principio del archivo, justo después de que se impriman los comandos en ejecución, por ejemplo, justo después de la línea:
    println "- VERBOSE: ${C_GREEN}${VERBOSE}${C_RESET}"
    
    1. Sobrescribir la línea:
    FABRIC_CFG_PATH=$PWD/../config/
    

    Con la siguiente configuración:

    FABRIC_CFG_PATH=$PWD/../config/org1
    export DFENCE_PKCS11_IP=127.0.0.1
    export DFENCE_PKCS11_USER=peer1
    export DFENCE_PKCS11_AUTO_RECONNECT=1
    
    1. Añadir la configuración de usuario PKCS#11 y la configuración según cada llamada de función, referida a una organización.

    2. Ejemplo, par1añade las líneas:

      export DFENCE_PKCS11_USER=peer1
      FABRIC_CFG_PATH="${PWD}/../config/org1"
      

      antes de la línea:

      installChaincode 1
      
    3. Ejemplo, peer2añade las líneas:

      export DFENCE_PKCS11_USER=peer2
      FABRIC_CFG_PATH="${PWD}/../config/org2"
      

      antes de la línea siguiente, y así sucesivamente.

      installChaincode 2
      
  13. Añada la configuración PKCS#11 al archivo fabric-samples/test-network/scripts/setAnchorPeer.sh.

    1. Añade las siguientes líneas, justo antes de la llamada a createAnchorPeerUpdate.

    A la variable $ORG se le asigna un valor de 1 o 2 dependiendo de la llamada. En nuestro ejemplo, la variable par de organización 1 es peer1 y de organización 2 peer2. Esta construcción de nombres permitió seleccionar automáticamente al usuario.

    export DFENCE_PKCS11_IP=host.docker.internal
    export DFENCE_PKCS11_USER=peer$ORG
    export DFENCE_PKCS11_AUTO_RECONNECT=1
    
  14. Crear script de prueba básico con soporte PKCS#11 test-p11-basic-transfer.sh. Configurar PKCS#11 según cada organización.

    #!/bin/bash
    
    #
    #   Execute basic asset transfer test
    #
    
    pushd ./fabric-samples/test-network
    export PATH=${PWD}/../bin:$PATH
    export FABRIC_CFG_PATH=$PWD/../config/org1
    
    # Environment variables for Org1
    export CORE_PEER_TLS_ENABLED=true
    export CORE_PEER_LOCALMSPID="Org1MSP"
    export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt
    export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp
    export CORE_PEER_ADDRESS=localhost:7051
    
    # PKCS#11 configurations for Org1
    export DFENCE_PKCS11_IP=127.0.0.1   # HSM IP Address
    export DFENCE_PKCS11_USER=peer1     # HSM User
    export DFENCE_PKCS11_AUTO_RECONNECT=1
    
    peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"InitLedger","Args":[]}'
    peer chaincode query -C mychannel -n basic -c '{"Args":["GetAllAssets"]}'
    peer chaincode invoke -o localhost:7050 --ordererTLSHostnameOverride orderer.example.com --tls --cafile "${PWD}/organizations/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem" -C mychannel -n basic --peerAddresses localhost:7051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt" --peerAddresses localhost:9051 --tlsRootCertFiles "${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt" -c '{"function":"TransferAsset","Args":["asset6","Christopher"]}'
    
    # Environment variables for Org2
    export CORE_PEER_TLS_ENABLED=true
    export CORE_PEER_LOCALMSPID="Org2MSP"
    export CORE_PEER_TLS_ROOTCERT_FILE=${PWD}/organizations/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt
    export CORE_PEER_MSPCONFIGPATH=${PWD}/organizations/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp
    export CORE_PEER_ADDRESS=localhost:9051
    
    # PKCS#11 configurations for Org2
    export DFENCE_PKCS11_USER=peer2  # HSM User
    export FABRIC_CFG_PATH=$PWD/../config/org2
    
    peer chaincode query -C mychannel -n basic -c '{"Args":["ReadAsset","asset6"]}'
    popd
    

Vaya a la red de prueba y ejecute una prueba

  1. Para cargar, ejecutar las pruebas y luego detener la red de pruebas, utilice los siguientes scripts.

    ./start-fabric.sh
    ./test-p11-basic-transfer.sh
    ./test-p11-ca-client.sh
    ./stop-fabric.sh