问题描述
我正在尝试使用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
来打开调试以评估策略。通常,对于正常操作而言,这太冗长了,但是它将使您更清楚地了解导致故障的确切原因。