Hyperledger Fabri c: каждая организация, выступающая в качестве партнера и заказывающая роль - какие сертификаты следует использовать? - PullRequest
1 голос
/ 17 июня 2020

хотя документы Fabri c не одобряют этот сценарий из-за настроек по умолчанию (не стоит расстраиваться, если вы позаботитесь о политиках, верно?), Мне нужно настроить сеть с 3 равноправными организации. У каждого будет 1 заказчик и 1 партнер.

Итак, мой crypto-config.yaml для cryptogen определяет 3 организации, каждая как заказчик и одноранговая организация:

OrdererOrgs:
  - Name: Org1
    Domain: org1.example.com
    EnableNodeOUs: true
    Specs:
      - Hostname: orderer

  # same for org2 and org3

PeerOrgs:
  - Name: Org1
    Domain: org1.example.com
    EnableNodeOUs: true
    Template:
      Count: 1
    Users:
      Count: 1

  # same for org2 and org3

configtx.yaml для configtxgen выглядит следующим образом:

---
Organizations:
    - &Org1
        Name: Org2MSP
        SkipAsForeign: false
        ID: Org1MSP
        MSPDir: crypto-config/ordererOrganizations/org1.example.com/msp

        Policies: &Org1Policies
            Readers:
                Type: Signature
                Rule: "OR('Org1.member')"
            Writers:
                Type: Signature
                Rule: "OR('Org1.member')"
            Admins:
                Type: Signature
                Rule: "OR('Org1.admin')"
            Endorsement:
                Type: Signature
                Rule: "OR('Org1.member')"
            BlockValidation:
                Type: Signature
                Rule: "OR('Org1.orderer')"

        OrdererEndpoints:
            - "127.0.0.1:7050"

        AnchorPeers:
            - Host: org1-peer1
              Port: 30110

    # same for org2 and org3

Теперь я запутался с выводом криптогена, потому что он создает двойные сертификаты для каждой организации. Примерно так:

crypto-config/ordererOrganizations/org1.example.com/...
crypto-config/peerOrganizations/org1.example.com/...

TL; DR
Вопрос: Должен ли я просто пропустить раздел PeerOrgs в crypto-config.yaml и упомянуть только каждую организацию под OrdererOrgs, если они действуют в обеих ролях ??

С уважением
Патрик

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Как указывается в вашем сообщении, Fabri c призывает пользователей никогда не делиться определением организации через пространства заказов и приложений. Это возможно, но это создает ряд проблем.

Во-первых, очень легко неправильно настроить политики и значительно снизить безопасность системы. Служба заказов и приложение работают по принципу разделения властей. Важно, чтобы узлы упорядочивания не могли создавать транзакции с аутентификацией, и также важно, чтобы участники транзакций приложений не могли создавать блоки. Хотя вы можете «быть осторожным», уверены ли вы, что точно понимаете, как применяется каждая политика и как оценивается каждая роль? Например, в опубликованном вами фрагменте configtx.yaml в вашей организации определена политика BlockValidation. Вы знаете, как это используется? (Подсказка: если вы не изменили другие части вашего configtx.yaml, это не так).

Во-вторых, поскольку определение MSP должно появиться в обоих разделах конфигурации канала, вы получите две идентичные копии MSP определение, которое должно быть точно синхронизировано c. Поскольку оба MSP имеют одинаковый идентификатор, если содержимое не в точности , это создает неоднозначность при оценке идентичностей. Таким образом, каждый раз при обновлении конфигурации канала появляется буквенное поле путем сравнения полей их конфигураций. Что касается обычных скриптов или инструментов, они обычно рассчитывают работать с одним определением за раз, поэтому вы, скорее всего, столкнетесь с проблемами здесь, если не откроете собственный инструмент.

Чтобы напрямую ответить на ваш вопрос, если вы действительно хотите запустить в этой странной конфигурации, я бы пропустил cryptogen и go прямо к fabri c -ca. В любом случае инструмент криптогена никогда не должен использоваться в производстве, и вам нужно будет начать развертывание инструментов, необходимых для поддержки этой конфигурации, так что в любом случае можно получить фору.

1 голос
/ 19 июня 2020

Вы можете перейти по этой ссылке:

https://medium.com/@kctheservant / decentralized-ordering-service-with-peer-org-own-orderers-d0939ea026f6

Следуя по этой ссылке вы можете иметь полное представление обо всем процессе.

Итак, файл crypto-config.yaml выглядит так:

PeerOrgs:
  - Name: Org1
    Domain: org1.example.com
    EnableNodeOUs: true
    Specs:
      - Hostname: orderer0
      - Hostname: orderer1
      - Hostname: peer0
      - Hostname: peer1
    Users:
      Count: 0
  - Name: Org2
    Domain: org2.example.com
    EnableNodeOUs: true
    Specs:
      - Hostname: orderer0
      - Hostname: orderer1
      - Hostname: peer0
      - Hostname: peer1
    Users:
      Count: 0

Вы также можете использовать fabri c -ca или OpenSSL или другие инструменты для генерации криптографических материалов.

configtx.yaml выглядит так:

Organizations:
    - &Org1
        Name: Org1MSP
        ID: Org1MSP
        MSPDir: crypto-config/peerOrganizations/org1.example.com/msp                
        Policies: &Org1MSPPolicies
            Readers:
                Type: Signature
                Rule: "OR('Org1MSP.member')"
            Writers:
                Type: Signature
                Rule: "OR('Org1MSP.member')"
            Admins:
                Type: Signature
                Rule: "OR('Org1MSP.admin')"
        AnchorPeers:
            - Host: peer0.org1.example.com
              Port: 7051

    - &Org2
        Name: Org2MSP
        ID: Org2MSP
        MSPDir: crypto-config/peerOrganizations/org2.example.com/msp
        Policies: &Org2MSPPolicies
            Readers:
                Type: Signature
                Rule: "OR('Org2MSP.member')"
            Writers:
                Type: Signature
                Rule: "OR('Org2MSP.member')"
            Admins:
                Type: Signature
                Rule: "OR('Org2MSP.admin')"
        AnchorPeers:
            - Host: peer0.org2.example.com
              Port: 7051

Capabilities:
    Channel: &ChannelCapabilities
        V1_4_3: true
    Orderer: &OrdererCapabilities
        V1_4_2: true
    Application: &ApplicationCapabilities
        V1_4_2: true
        V1_3: false
        V1_2: false
        V1_1: false

Application: &ApplicationDefaults
    Organizations:
    Policies: &ApplicationDefaultPolicies
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
    Capabilities:
        <<: *ApplicationCapabilities

Orderer: &OrdererDefaults
    OrdererType: etcdraft
    Addresses:
        - orderer0.org1.example.com:7050
        - orderer1.org1.example.com:7050
        - orderer0.org2.example.com:7050
        - orderer1.org2.example.com:7050
    BatchTimeout: 2s
    BatchSize:
        MaxMessageCount: 500
        AbsoluteMaxBytes: 10 MB
        PreferredMaxBytes: 2 MB
    MaxChannels: 0
    Kafka:
        Brokers:
            - kafka0:9092
            - kafka1:9092
            - kafka2:9092
    EtcdRaft:
        Consenters:
            - Host: orderer0.org1.example.com
              Port: 7050
              ClientTLSCert: crypto-config/peerOrganizations/org1.example.com/peers/orderer0.org1.example.com/tls/server.crt
              ServerTLSCert: crypto-config/peerOrganizations/org1.example.com/peers/orderer0.org1.example.com/tls/server.crt
            - Host: orderer1.org1.example.com
              Port: 7050
              ClientTLSCert: crypto-config/peerOrganizations/org1.example.com/peers/orderer1.org1.example.com/tls/server.crt
              ServerTLSCert: crypto-config/peerOrganizations/org1.example.com/peers/orderer1.org1.example.com/tls/server.crt
            - Host: orderer0.org2.example.com
              Port: 7050
              ClientTLSCert: crypto-config/peerOrganizations/org2.example.com/peers/orderer0.org2.example.com/tls/server.crt
              ServerTLSCert: crypto-config/peerOrganizations/org2.example.com/peers/orderer0.org2.example.com/tls/server.crt
            - Host: orderer1.org2.example.com
              Port: 7050
              ClientTLSCert: crypto-config/peerOrganizations/org2.example.com/peers/orderer1.org2.example.com/tls/server.crt
              ServerTLSCert: crypto-config/peerOrganizations/org2.example.com/peers/orderer1.org2.example.com/tls/server.crt

        Options:
            TickInterval: 500ms
            ElectionTick: 10
            HeartbeatTick: 1
            MaxInflightBlocks: 5
            SnapshotIntervalSize: 20 MB
    Organizations:
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
        BlockValidation:
            Type: ImplicitMeta
            Rule: "ANY Writers"
    Capabilities:
        <<: *OrdererCapabilities
Channel: &ChannelDefaults
    Policies:
        Readers:
            Type: ImplicitMeta
            Rule: "ANY Readers"
        Writers:
            Type: ImplicitMeta
            Rule: "ANY Writers"
        Admins:
            Type: ImplicitMeta
            Rule: "MAJORITY Admins"
    Capabilities:
        <<: *ChannelCapabilities

Profiles:
    OrdererGenesis:
        <<: *ChannelDefaults
        Orderer:
            <<: *OrdererDefaults
            Organizations:
                - *Org1
                - *Org2
        Consortiums:
            SampleConsortium:
                Organizations:
                    - *Org1
                    - *Org2
    Channel:
        <<: *ChannelDefaults
        Consortium: SampleConsortium
        Application:
            <<: *ApplicationDefaults
            Organizations:
                - *Org1
                - *Org2

Теперь для заказчика используйте fabri c fabri c -изображение для заказа в файле docker, чтобы вверх по заказчику.

services:
  orderer0.org1.example.com:
    container_name: orderer0.org1.example.com
    image: hyperledger/fabric-orderer:$IMAGE_TAG
    environment:
      - FABRIC_LOGGING_SPEC=INFO
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/var/hyperledger/orderer/orderer.genesis.block
      - ORDERER_GENERAL_LOCALMSPID=Org1MSP
      - ORDERER_GENERAL_LOCALMSPDIR=/var/hyperledger/orderer/msp
      # enabled TLS
      - ORDERER_GENERAL_TLS_ENABLED=true
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_TLS_CERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_TLS_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
      - ORDERER_KAFKA_TOPIC_REPLICATIONFACTOR=1
      - ORDERER_KAFKA_VERBOSE=true
      - ORDERER_GENERAL_CLUSTER_CLIENTCERTIFICATE=/var/hyperledger/orderer/tls/server.crt
      - ORDERER_GENERAL_CLUSTER_CLIENTPRIVATEKEY=/var/hyperledger/orderer/tls/server.key
      - ORDERER_GENERAL_CLUSTER_ROOTCAS=[/var/hyperledger/orderer/tls/ca.crt]
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    ports:
      - 7050:7050
    volumes:
        - ./channel-artifacts/genesis.block:/var/hyperledger/orderer/orderer.genesis.block
        - ./crypto-config/peerOrganizations/org1.example.com/peers/orderer0.org1.example.com/msp:/var/hyperledger/orderer/msp
        - ./crypto-config/peerOrganizations/org1.example.com/peers/orderer0.org1.example.com/tls/:/var/hyperledger/orderer/tls
        - orderer0.org1.example.com:/var/hyperledger/production/orderer
    networks:
      - byfn

Теперь для однорангового узла используйте fabri c fabri c -peer image в файле docker для повышения уровня однорангового узла.

services:
  peer0.org1.example.com:
    container_name: peer0.org1.example.com
    image: hyperledger/fabric-peer:$IMAGE_TAG
    environment:
      - CORE_PEER_ID=peer0.org1.example.com
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_PEER_LISTENADDRESS=0.0.0.0:7051
      - CORE_PEER_CHAINCODEADDRESS=peer0.org1.example.com:7052
      - CORE_PEER_CHAINCODELISTENADDRESS=0.0.0.0:7052
      - CORE_PEER_GOSSIP_BOOTSTRAP=peer1.org1.example.com:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
      - CORE_VM_ENDPOINT=unix:///host/var/run/docker.sock
      # the following setting starts chaincode containers on the same
      # bridge network as the peers
      # https://docs.docker.com/compose/networking/
      - CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE=first-network
      - FABRIC_LOGGING_SPEC=INFO
      #- FABRIC_LOGGING_SPEC=DEBUG
      - CORE_PEER_TLS_ENABLED=true
      - CORE_PEER_GOSSIP_USELEADERELECTION=true
      - CORE_PEER_GOSSIP_ORGLEADER=false
      - CORE_PEER_PROFILE_ENABLED=true
      - CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/fabric/tls/server.crt
      - CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/fabric/tls/server.key
      - CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/fabric/tls/ca.crt      
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric/peer
    command: peer node start
    ports:
      - 7051:7051
    volumes:
        - /var/run/:/host/var/run/
        - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp:/etc/hyperledger/fabric/msp
        - ./crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls:/etc/hyperledger/fabric/tls
        - peer0.org1.example.com:/var/hyperledger/production
    networks:
      - byfn

...