调试TLS握手失败

时间:2020-09-21 15:39:00

标签: hyperledger-fabric

我正在尝试通过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

2 个答案:

答案 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吗?

相关问题