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. Supervisar los registros y salidas del red de pruebas. Los registros del HSM se puede ver aquí, cuando se vincula con el 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 de 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. Establecer la variable de entorno GOPATH con el directorio de trabajo, en este caso usaremos ~/go. Puede definir en el ~/.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 Hyperledger tela-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 el tela-ca e 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 fabric-ca/bin.

  3. Copiar los binarios tela-ca e fabric-ca-client a la muestras-tejido/bin.

  4. Clon fabricación .

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

    make tools GO_TAGS=pkcs11
    

    Los binarios se generan en construir/bin.

  6. Copie los binarios generados en el directorio muestras-tejido/bin.

Integración con fabric-ca-client

  • Hay una prueba fabric-ca-client en el archivo ./fabric-samples/hardware-security-module.
  • El expediente, ./fabric-samples/hardware-security-module/README.md puede servir de guía, pero debe adaptarse.

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 el bccspcambie los siguientes campos: - EtiquetaEtiqueta del token P11. Dinamo En el caso de que sea "Dinamo HSM". - PinContraseña utilizada para iniciar sesión en P11. Dinamo Contraseña del usuario configurado en P11 .

    No modifique 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. Cambiar la IP y el usuario de HSM en el siguiente script. Este script generará el archivo de configuración del tejido que se utilizará para hacer el 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 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 HSM. El archivo Dockerfile se encuentra en el $GOPATH/src/github.com/hyperledger/fabric-ca/images/fabric-ca. Tras los cambios, el archivo debería 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. Compilar el tela-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. Cambiar los archivos de configuración fabric-ca-server-config.yaml de cada organización a utilizar PKCS#11 del HSM. Estos archivos se encuentran en las rutas que se indican a continuación:

    • 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. Cambiar la sección bccsp para 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 HSM en el archivo de composición del componer-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 el registro remoto de HSM que el usuario haya configurado (por ejemplo 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 siguientes archivos Docker están en ruta $GOPATH/src/github.com/hyperledger/fabric/images/.

  1. Editar los archivos Dockerfile de peer y el ordenante para ser compilado con Ubuntu y con 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 compañeros.

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

    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 parar con CTRL-C justo después de las identidades del Peer2 o en cuanto empiece a generar identidades de Ordenante.

      ./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 de org1 e org2 en el tejido-muestras/test-red y haga una copia del fabric-ca-client-config.yaml a la carpeta de la organización correspondiente.

    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 correctamente la red de prueba.

  3. Cambiar la sección bccsp con la configuración PKCS#11, del 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 llave bccsp de la 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 HSM en el componer de la componer-ca.yaml.

    Este archivo se encuentra en 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 de cliente de HSM para la compañerosen el archivo fabric-samples/test-network/compose/docker/docker-compose-test-net.yaml.

    Añada las variables de entorno de configuración para HSM para cada peer, peer0.org1.ejemplo.com e peer0.org2.ejemplo.comcomo 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 active PKCS#11 en el archivo fabric-samples/test-network/network.sh.

    En el papel createOrgs incluir los ajustes antes de cada llamada a crearOrg1 e crearOrg2como sigue.

    .
    .
    .
    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 de org1 e org2 en el fabric-samples/config y haga una copia del core.yaml a 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. Cambiar el guión fabric-samples/test-network/organisations/fabric-ca/registerEnroll.sh para utilizar PKCS#11 y utilizar los archivos de configuración necesarios.

    1. Editar las funciones crearOrg1 e crearOrg2con los siguientes cambios:

      1. Añadir al principio de la función, debajo de la línea (export FABRIC_CA_CLIENT_HOME...), el código siguiente para activar 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
      

      Cambiar 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 e org2/fabric-ca-client-config.yaml.

    2. Utilice la BCCSP en software para generar el certificado TLS del peer.

    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. Cambiar 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 principio de la función crearCanal.
    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. Elimine 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ñade la configuración del usuario y la ruta a la configuración antes de cada llamada (joinChannel, setAnchorPeer) relativa a una organización.

    2. Por ejemplo, par1añada las siguientes líneas antes de la llamada a joinChannel 1.

      export DFENCE_PKCS11_USER=peer1
      FABRIC_CFG_PATH="${PWD}/../config/org1"
      
    3. Por ejemplo, par2añada las siguientes líneas antes de la llamada a joinCanal 2etc.

      export DFENCE_PKCS11_USER=peer2
      FABRIC_CFG_PATH="${PWD}/../config/org2"
      
  12. Cambiar 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 líneas siguientes, justo antes de la llamada a createAnchorPeerUpdate.

    La variable $ORG recibe el valor 1 o 2 en función de la llamada. En nuestro ejemplo, el peer de organización 1 es el par1 y organización 2 par2. Esta construcción del nombre permitía 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. Creación de un script de prueba básico compatible con 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