尝试将对等方加入频道时,发生“此策略要求满足'Readers'子策略中的1个:权限被拒绝”错误

问题描述

我正在尝试使用Fabric v2.2,但由于某些策略问题而无法加入对等方到通道(我想)。为了获得订购者和对等点的MSP,我使用了订购者组织和对等组织(有一个对等组织)的CA。

fabric-ca-client register -d --id.name ${PEERS[$i]} --id.secret ${PEER_ADMIN_PWS[$i]} --id.type peer -u https://$CA_NODE:7054
…
fabric-ca-client register -d --id.name $ORG_ADMIN_ID --id.secret $ORG_ADMIN_PW --id.type admin -u https://$CA_NODE:7054
….
fabric-ca-client register -d --id.name ${ORDERERS[$i]} --id.secret ${ORDERER_ADMIN_PWS[$i]} --id.type orderer -u https://$CA_NODE:7054

…
fabric-ca-client enroll -d -u https://${NODES[$i]}:${NODE_ADMIN_PWS[$i]}@$CA_NODE:7054

我认为MSP可以,因为网络运行良好。

然后,我启动了一个CLI容器并创建了一个名为identitych的通道。我认为它很好用,因为我检查了identitych目录是否已在所有订购者的chains目录下创建。

此后,当我建议使用以下命令将对等方加入通道时,由于权限被拒绝,订购者无法将块传递给对等体,并且由于FORBIDDEN,对等体也无法从订购者中检索到块问题。

peer channel join -b /channel-artifacts/identitych.block

我的configtx.yaml文件如下:

Organizations:
  - &BPLOrdererOrg
    Name: BPLOrdererMSP
    ID: BPLOrdererMSP
    MSPDir: ./orderers/org-msp

    Policies:
      Readers:
        Type: Signature
        Rule: "OR('BPLOrdererMSP.member')"
      Writers:
        Type: Signature
        Rule: "OR('BPLOrdererMSP.member')"
      Admins:
        Type: Signature
        Rule: "OR('BPLOrdererMSP.admin')"

    OrdererEndpoints:
      - orderer0.common.bpl:7050

  - &BPLOrg
    Name: BPLMSP
    ID: BPLMSP
    MSPDir: ./peers/org-msp

    Policies:
      Readers:
        Type: Signature
        Rule: "OR('BPLMSP.admin','BPLMSP.peer','BPLMSP.client')"
      Writers:
        Type: Signature
        Rule: "OR('BPLMSP.admin','BPLMSP.client')"
      Admins:
        Type: Signature
        Rule: "OR('BPLMSP.admin')"
      Endorsement:
        Type: Signature
        Rule: "OR('BPLMSP.peer')"
通过将NodeOUs放置在每个订购者和对等方的msp目录中来启用

config.yaml

# config.yaml
NodeOUs:
  Enable: true
  ClientOUIdentifier:
    Certificate: "cacerts/cacert.pem"
    OrganizationalUnitIdentifier: "client"
  AdminOUIdentifier:
    Certificate: "cacerts/cacert.pem"
    OrganizationalUnitIdentifier: "admin"
  PeerOUIdentifier:
    Certificate: "cacerts/cacert.pem"
    OrganizationalUnitIdentifier: "peer"
  OrdererOUIdentifier:
    Certificate: "cacerts/cacert.pem"
    OrganizationalUnitIdentifier: "orderer"

重复,订购者将显示以下警告:

2020-08-20 11:35:08.041 UTC [comm.grpc.server] 1 -> INFO 0c3 streaming call completed grpc.service=orderer.AtomicBroadcast grpc.method=Deliver grpc.peer_address=172.24.0.11:42642 grpc.code=OK grpc.call_duration=792.5µs
2020-08-20 11:35:15.176 UTC [common.deliver] deliverBlocks -> WARN 0c4 [channel: identitych] Client 172.24.0.8:60236 is not authorized: implicit policy evaluation failed - 0 sub-policies were satisfied,but this policy requires 1 of the 'Readers' sub-policies to be satisfied: permission denied

与此同时,对等方也反复打印以下警告:

2020-08-20 11:34:28.604 UTC [peer.blocksprovider] DeliverBlocks -> WARN 02b Got error while attempting to receive blocks: received bad status FORBIDDEN from orderer channel=identitych orderer-address=orderer0.common.bpl:7050
2020-08-20 11:34:28.604 UTC [peer.blocksprovider] func1 -> WARN 02c Encountered an error reading from deliver stream: EOF channel=identitych orderer-address=orderer0.common.bpl:7050

我发现了类似的问答(link),并且对以下引用感到好奇:

检查在configtx.yaml中定义的读取器策略,由于策略不匹配而产生此错误。您已经在Reader策略中定义了一些特定的用户类型(admin,peer,client),但是这种特定的用户类型不会传递到为您的peer生成的证书中。

我同意我的问题是由于政策不匹配,但我不理解以下内容:

但是此特定用户类型不会传递到您为对等方生成的证书中。

我该如何解决我的问题?谢谢,谢谢。

解决方法

您似乎尚未为频道配置中包含的MSP定义启用NodeOU。

通过将config.yaml放置在每个订购者和对等方的msp目录中来启用NodeOU。

这将在对等方和订购者的“本地MSP”中启用NodeOU支持,但是对于通道操作(如调用"browser": { "fs": false,"path": false,"os": false } API),将使用通道MSP定义。

确保在生成之前,将Deliver放置在config.yaml所引用的MSP目录中(例如,在configtx.yaml下)。您的订单系统渠道的创始块。

其他说明:

您可以通过更改./peers/org-msp中的“读者”策略以使其与对等组织参考configtx.yaml来确认它与NodeOU有关,就像对订购组织一样。如果一切都符合成员政策,那肯定与NodeOU有关。

您还可以通过设置member来打开调试以评估策略。通常,对于正常操作而言,这太冗长了,但是它将使您更清楚地了解导致故障的确切原因。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...