我正在尝试通过fabric-network
nodejs sdk访问我的对等方。
但是,我在sdk的gateway.connect
期间遇到了错误,并且在对等容器中找到的日志没有帮助。
即使使用grpc=debug
记录模式,我所拥有的仍然是:
peer0.catie-test | 2020-09-21 13:27:07.731 UTC [core.comm] ServerHandshake -> ERRO 087 TLS handshake failed with error remote error: tls: handshake failure server=PeerServer remoteaddress=172.17.0.1:49918
peer0.catie-test | 2020-09-21 13:27:07.731 UTC [grpc] handleRawConn -> DEBU 088 grpc: Server.Serve failed to complete security handshake from "172.17.0.1:49918": remote error: tls: handshake failure
是否有更多有用的日志?例如,我想知道哪个密钥用于TLS握手检查。
编辑更多信息:配置文件和TLS验证
我的对等方配置了带有env变量的TLS:
CORE_PEER_TLS_ENABLED=true
CORE_PEER_TLS_KEY_FILE=/etc/hyperledger/crypto/peer/tls-msp/keystore/key.pem
CORE_PEER_TLS_CERT_FILE=/etc/hyperledger/crypto/peer/tls-msp/signcerts/cert.pem
CORE_PEER_TLS_ROOTCERT_FILE=/etc/hyperledger/crypto/peer/tls-msp/tlscacerts/tlsca.catie-test-cert.pem
我在客户端具有正确的tlscacert,因为对等端和客户端的输出相同:
cat /etc/hyperledger/crypto/peer/tls-msp/tlscacerts/tlsca.catie-test-cert.pem # From the peer, output ZTd/o8LLw== at the end
cat /tmp/fabric-start-catie-test/building/artifacts/peer0.catie-test-crypto/tls-msp/tlscacerts/tlsca.catie-test-cert.pem # From the client, output ZTd/o8LLw== at the end
到对等tlscacert的路径在客户端connection-profile.json中填充:
"peers": {
"peer0.catie-test": {
"tlsCACerts": {
"path": "/tmp/fabric-start-catie-test/building/artifacts/peer0.catie-test-crypto/tls-msp/tlscacerts/tlsca.catie-test-cert.pem"
},
"grpcOptions":{
"ssl-target-name-override": "172.17.0.7",
"grpc.keepalive_time_ms": 10000
},
"url": "grpcs://172.17.0.4:7051",
"eventUrl": "grpcs://172.17.0.4:7053"
}
}
我还检查了tlsCAcert是生成我的对等证书的那个:
openssl verify -CAfile $CORE_PEER_TLS_ROOTCERT_FILE $CORE_PEER_TLS_CERT_FILE # Output : /etc/hyperledger/crypto/peer/tls-msp/signcerts/cert.pem: OK
编辑2: Grpc选项,对等名称代替IP和客户端日志
还尝试将grpcOptions
添加到peer
的{{1}}部分中(请参阅上面的更新段落),但是它没有任何改变。
还尝试将对等方名称添加到我的connection-profile.json
中,以通过其名称而不是其IP到达我的对等方。它使警告消失,但不能解决我的问题,我更喜欢在脚本中使用IP。
这里是nodejs sdk客户端的日志,以防它有助于诊断问题,但它只说了/etc/hosts
,我想是的,因为它到达了我的同级,因为我在TLS中遇到此TLS错误我同伴的日志。
Endorser must be connected
编辑3: Docker IP?尝试使用EC2实例。
正如@Urko所提到的,我的节点实际上是运行docker-in-docker(dind)映像的docker容器。在这些容器内还有其他一些运行超级账本对等的容器,cli,...图像。
我从主机上访问它们,这也是我运行Fabric SDK js客户端的地方。我无法通过它们的容器名称访问它们,我认为这只能在docker-compose配置中进行,对吗?我已经尝试过(请参阅上面的Edit 2)将它们的名称添加到我的/ etc / hosts中,以通过名称而不是IP来访问它们,但是它没有任何改变。
但是,由于我的网络启动脚本是脚本编写的,所以这次我在AWS中使用docker-machine而不是dind docker容器部署了它,因此这些都是可在Internet上访问的真实实例。但是我仍然遇到相同的错误,这是来自对等方的日志,您可以看到这是来自公共IP的日志:
(node:59350) [DEP0123] DeprecationWarning: Setting the TLS ServerName to an IP address is not permitted by RFC 6066. This will be ignored in a future version.
2020-09-23T06:42:20.704Z - error: [ServiceEndpoint]: Error: Failed to connect before the deadline on Endorser- name: peer0.catie-test, url:grpcs://172.17.0.7:7051, connected:false, connectAttempted:true
2020-09-23T06:42:20.705Z - error: [ServiceEndpoint]: waitForReady - Failed to connect to remote gRPC server peer0.catie-test url:grpcs://172.17.0.7:7051 timeout:3000
2020-09-23T06:42:20.708Z - error: [NetworkConfig]: buildPeer - Unable to connect to the endorser peer0.catie-test due to Error: Failed to connect before the deadline on Endorser- name: peer0.catie-test, url:grpcs://172.17.0.7:7051, connected:false, connectAttempted:true
at checkState (/home/rqueraud/CATIE/Myrmica/myrmica-start/node_modules/@grpc/grpc-js/build/src/client.js:69:26)
at Timeout._onTimeout (/home/rqueraud/CATIE/Myrmica/myrmica-start/node_modules/@grpc/grpc-js/build/src/channel.js:292:17)
at listOnTimeout (internal/timers.js:549:17)
at processTimers (internal/timers.js:492:7) {
connectFailed: true
}
(node:59350) UnhandledPromiseRejectionWarning: Error: Endorser must be connected
at Channel.addEndorser (/home/rqueraud/CATIE/Myrmica/myrmica-start/node_modules/fabric-common/lib/Channel.js:259:10)
at buildChannel (/home/rqueraud/CATIE/Myrmica/myrmica-start/node_modules/fabric-network/lib/impl/ccp/networkconfig.js:50:21)
at Object.loadFromConfig (/home/rqueraud/CATIE/Myrmica/myrmica-start/node_modules/fabric-network/lib/impl/ccp/networkconfig.js:34:19)
at processTicksAndRejections (internal/process/task_queues.js:97:5)
at async Gateway.connect (/home/rqueraud/CATIE/Myrmica/myrmica-start/node_modules/fabric-network/lib/gateway.js:279:13)
at async queryChaincode (/home/rqueraud/CATIE/Myrmica/myrmica-start/test/chaincode-sdk/index.js:41:5)
at async /home/rqueraud/CATIE/Myrmica/myrmica-start/test/chaincode-sdk/index.js:57:5
答案 0 :(得分:0)
您尝试在对等服务器中进行gRPC调用,其中对等服务器使用其TLS系统进行保护。因此,如果您未能提供有效的TLS证书,则服务器tls握手将会失败,并且您将无法成功建立连接。
请检查您的网络配置文件是否正确开发,并检查您使用的是用于运行对等服务器的TLS证书,并且TLS证书路径正确。
答案 1 :(得分:0)
似乎与对等方的连接已定义为由TLS协议保护。因此,您可以将对等配置配置为知道在TLS中使用的证书。
与使用此协议连接到任何服务器时一样,使用服务器的证书(在这种情况下,对等方将是服务器)来加密各方之间的通信。因此,您需要配置客户端以通过根CA信任服务器,而根CA一直用于颁发对等TLS证书。
客户端是您使用SDK的地方,因此,您应该将其配置为信任Peer TLS证书。在配置与区块链节点(对等节点和订购者)的连接时,您将定义它们的方向以及TLS证书。您可以在以下link中找到此示例。在这里,您必须定义tlsCACerts参数的值:
orderers:
orderer.example.com:
url: grpcs://localhost:7050
grpcOptions:
ssl-target-name-override: orderer.example.com
grpc-max-send-message-length: 4194304
tlsCACerts:
path: test/fixtures/channel/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tlscacerts/example.com-cert.pem
peers:
peer0.org1.example.com:
url: grpcs://localhost:7051
grpcOptions:
ssl-target-name-override: peer0.org1.example.com
grpc.keepalive_time_ms: 600000
tlsCACerts:
path: test/fixtures/channel/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tlscacerts/org1.example.com-cert.pem
-----编辑----
此外,您还必须检查ssl-target-name-override
参数的值。如您在示例文件中看到的,您的节点名称应与之相同。
-----编辑----
您为什么要使用这些IP?我了解这些IP是Docker网络内部的,因此您不应使用它们。您可以尝试使用容器名称代替docker网络IP吗?
-----已编辑----
您可以验证您的ca-server
配置文件并检查tls
设置为true吗?