使用多个组织订购者创建 Hyperledger Fabric 通道时出现 TLS 握手错误
TLS Handshake Error while Creating Hyperledger Fabric Channel with Multiple Organisation Orderers
场景: 我有两个组织,每个组织中有两个同行。现在,我希望每个组织也提供一个排序节点。
下面是我的crypto-config.yaml文件:
OrdererOrgs:
- Name: Orderer1
Domain: org1.xyz.com
Template:
Count: 1
- Name: Orderer2
Domain: org2.xyz.com
Template:
Count: 1
下面是我的configtx.yaml文件:
- &OrdererOrg1
Name: OrdererOrg01
ID: Orderer1MSP
MSPDir: crypto-config/ordererOrganizations/org1.xyz.com/msp
Policies:
Readers:
Type: Signature
Rule: "OR('Orderer1MSP.member')"
Writers:
Type: Signature
Rule: "OR('Orderer1MSP.member')"
Admins:
Type: Signature
Rule: "OR('Orderer1MSP.admin')"
- &OrdererOrg2
Name: OrdererOrg02
ID: Orderer2MSP
MSPDir: crypto-config/ordererOrganizations/org2.xyz.com/msp
Policies:
Readers:
Type: Signature
Rule: "OR('Orderer2MSP.member')"
Writers:
Type: Signature
Rule: "OR('Orderer2MSP.member')"
Admins:
Type: Signature
Rule: "OR('Orderer2MSP.admin')"
下面是我的docker-compose-cli.yaml文件:
services:
orderer.xyz.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.xyz.com
container_name: orderer.xyz.com
networks:
- byfn
orderer0.xyz.com:
extends:
file: base/docker-compose-base.yaml
service: orderer0.xyz.com
container_name: orderer0.xyz.com
networks:
- byfn
我尝试使用以下命令创建频道:
peer channel create -o orderer.xyz.com:7050 -t 60s -c bay -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/org1.xyz.com/orderers/orderer0.org1.xyz.com/msp/tlscacerts/tlsca.org1.xyz.com-cert.pem
我在创建通道时在 Orderer 容器日志中收到以下 错误:
[core.comm] ServerHandshake -> ERRO 015 TLS handshake failed with
error remote error: tls: bad certificate {"server": "Orderer", "remote
address": "172.22.0.18:48594"}
那么,对于提供同级的组织,是否有可能同时提供排序节点,或者单独的第三方组织将提供排序节点(如教程中所述)?为什么我会收到此错误消息?
感谢您抽出时间,如果您需要任何进一步的信息,请告诉我。
我不知道你是如何定义网络中组织和同行的结构的,但是,通过观察你为 --cacert
和配置文件指定的路径,在我看来 telco1.vodworks.com
未指定为订购者组织。
总的来说,我可能会问,你确定 --cacert
的路径是正确的吗?
我不是这方面的专家,但我不确定您为什么要尝试连接到 orderer.xyz.com?我有一个看起来像你正在尝试做的设置,为此你应该通过将以下行添加到你的加密配置文件(对于两个订购者)来为你想要创建的每个订购节点命名:
Specs:
- Hostname: orderer
你应该定义两个相应的容器,一个叫 orderer.org1.xyz.com,另一个叫 orderer.org2.xyz.com 在你的 compose 文件里。
然后您应该可以通过联系订购者来创建频道。org1.xyz.com。
我终于找到了这个问题背后的真正原因。问题出在 docker-compose-cli.yaml 文件中排序容器的服务名称。服务名称应与 crypto-config.yaml 文件中指定的名称匹配,遵循 hostname.domain 模式。
因此,我更改了 docker-compose-cli.yaml 文件中的订购者配置,如下所示:
services:
orderer0.telco1.vodworks.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.vodworks.com
container_name: orderer.vodworks.com
networks:
- byfn
orderer0.telco2.vodworks.com:
extends:
file: base/docker-compose-base.yaml
service: orderer0.vodworks.com
container_name: orderer0.vodworks.com
networks:
- byfn
之后,我修改了script.sh和[中的peer channel
命令utils.sh 脚本通过添加正确的订购者名称。经过这几项更改后,我能够 运行 我的网络成功并通过安装链代码验证了此部署。
感谢@arnaud-j-le-hors 提供的示例应用程序帮助我解决了这个问题。
在我的例子中,我遇到了这个错误
[core.comm] ServerHandshake -> ERRO 025 TLS handshake failed with error remote error: tls: internal error {"server": "Orderer", "remote address": "190.22.189.42:40746"}
当我使用 fabric sdk 连接到启用了 TLS 的 Fabric 网络时。
要解决此问题,您需要确保连接配置文件使用 Orderer 部分中的 hostnameOverride 属性,这是一个示例
orderers:
orderer.example.com:
url: grpcs://localhost:7050
# these are standard properties defined by the gRPC library
# they will be passed in as-is to gRPC client constructor
grpcOptions:
hostnameOverride: orderer.example.com
grpc-max-send-message-length: 15
grpc.keepalive_time_ms: 360000
grpc.keepalive_timeout_ms: 180000
请查看下一个示例以获取更多信息:https://github.com/hyperledger/fabric-sdk-java/blob/master/src/test/fixture/sdkintegration/network_configs/network-config-tls.yaml
真的,我在这个错误中工作了好几天,终于找到了解决方案
要了解更多信息、结构培训或为智利和拉丁美洲的 Hyperledger Fabric 企业和政府开发区块链解决方案,请访问 www.blockchainempresarial.com
场景: 我有两个组织,每个组织中有两个同行。现在,我希望每个组织也提供一个排序节点。
下面是我的crypto-config.yaml文件:
OrdererOrgs:
- Name: Orderer1
Domain: org1.xyz.com
Template:
Count: 1
- Name: Orderer2
Domain: org2.xyz.com
Template:
Count: 1
下面是我的configtx.yaml文件:
- &OrdererOrg1
Name: OrdererOrg01
ID: Orderer1MSP
MSPDir: crypto-config/ordererOrganizations/org1.xyz.com/msp
Policies:
Readers:
Type: Signature
Rule: "OR('Orderer1MSP.member')"
Writers:
Type: Signature
Rule: "OR('Orderer1MSP.member')"
Admins:
Type: Signature
Rule: "OR('Orderer1MSP.admin')"
- &OrdererOrg2
Name: OrdererOrg02
ID: Orderer2MSP
MSPDir: crypto-config/ordererOrganizations/org2.xyz.com/msp
Policies:
Readers:
Type: Signature
Rule: "OR('Orderer2MSP.member')"
Writers:
Type: Signature
Rule: "OR('Orderer2MSP.member')"
Admins:
Type: Signature
Rule: "OR('Orderer2MSP.admin')"
下面是我的docker-compose-cli.yaml文件:
services:
orderer.xyz.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.xyz.com
container_name: orderer.xyz.com
networks:
- byfn
orderer0.xyz.com:
extends:
file: base/docker-compose-base.yaml
service: orderer0.xyz.com
container_name: orderer0.xyz.com
networks:
- byfn
我尝试使用以下命令创建频道:
peer channel create -o orderer.xyz.com:7050 -t 60s -c bay -f ./channel-artifacts/channel.tx --tls true --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/org1.xyz.com/orderers/orderer0.org1.xyz.com/msp/tlscacerts/tlsca.org1.xyz.com-cert.pem
我在创建通道时在 Orderer 容器日志中收到以下 错误:
[core.comm] ServerHandshake -> ERRO 015 TLS handshake failed with error remote error: tls: bad certificate {"server": "Orderer", "remote address": "172.22.0.18:48594"}
那么,对于提供同级的组织,是否有可能同时提供排序节点,或者单独的第三方组织将提供排序节点(如教程中所述)?为什么我会收到此错误消息?
感谢您抽出时间,如果您需要任何进一步的信息,请告诉我。
我不知道你是如何定义网络中组织和同行的结构的,但是,通过观察你为 --cacert
和配置文件指定的路径,在我看来 telco1.vodworks.com
未指定为订购者组织。
总的来说,我可能会问,你确定 --cacert
的路径是正确的吗?
我不是这方面的专家,但我不确定您为什么要尝试连接到 orderer.xyz.com?我有一个看起来像你正在尝试做的设置,为此你应该通过将以下行添加到你的加密配置文件(对于两个订购者)来为你想要创建的每个订购节点命名:
Specs:
- Hostname: orderer
你应该定义两个相应的容器,一个叫 orderer.org1.xyz.com,另一个叫 orderer.org2.xyz.com 在你的 compose 文件里。
然后您应该可以通过联系订购者来创建频道。org1.xyz.com。
我终于找到了这个问题背后的真正原因。问题出在 docker-compose-cli.yaml 文件中排序容器的服务名称。服务名称应与 crypto-config.yaml 文件中指定的名称匹配,遵循 hostname.domain 模式。
因此,我更改了 docker-compose-cli.yaml 文件中的订购者配置,如下所示:
services:
orderer0.telco1.vodworks.com:
extends:
file: base/docker-compose-base.yaml
service: orderer.vodworks.com
container_name: orderer.vodworks.com
networks:
- byfn
orderer0.telco2.vodworks.com:
extends:
file: base/docker-compose-base.yaml
service: orderer0.vodworks.com
container_name: orderer0.vodworks.com
networks:
- byfn
之后,我修改了script.sh和[中的peer channel
命令utils.sh 脚本通过添加正确的订购者名称。经过这几项更改后,我能够 运行 我的网络成功并通过安装链代码验证了此部署。
感谢@arnaud-j-le-hors 提供的示例应用程序帮助我解决了这个问题。
在我的例子中,我遇到了这个错误
[core.comm] ServerHandshake -> ERRO 025 TLS handshake failed with error remote error: tls: internal error {"server": "Orderer", "remote address": "190.22.189.42:40746"}
当我使用 fabric sdk 连接到启用了 TLS 的 Fabric 网络时。 要解决此问题,您需要确保连接配置文件使用 Orderer 部分中的 hostnameOverride 属性,这是一个示例
orderers:
orderer.example.com: url: grpcs://localhost:7050
# these are standard properties defined by the gRPC library
# they will be passed in as-is to gRPC client constructor
grpcOptions:
hostnameOverride: orderer.example.com
grpc-max-send-message-length: 15
grpc.keepalive_time_ms: 360000
grpc.keepalive_timeout_ms: 180000
请查看下一个示例以获取更多信息:https://github.com/hyperledger/fabric-sdk-java/blob/master/src/test/fixture/sdkintegration/network_configs/network-config-tls.yaml
真的,我在这个错误中工作了好几天,终于找到了解决方案
要了解更多信息、结构培训或为智利和拉丁美洲的 Hyperledger Fabric 企业和政府开发区块链解决方案,请访问 www.blockchainempresarial.com