启用TLS的多主机Fabric网络中fabric-sdk-rest握手失败求助
解决Hyperledger Fabric SDK REST启用TLS后无法连接Peer的问题
从你提供的错误日志来看,核心问题是TLS握手时证书验证失败:
E0510 10:51:04.780559355 12247 ssl_transport_security.cc:989] Handshake failed with fatal error SSL_ERROR_SSL: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed.
结合你的多主机Docker Swarm环境和配置,我整理了几个关键排查点和解决方案:
1. 检查证书主机名匹配(最常见原因)
TLS验证要求请求的主机名必须和证书中的**Subject Alternative Name (SAN)**字段完全匹配:
- 先查看Peer证书的SAN信息,执行命令:
确认输出中openssl x509 -in $HOME/mynetwork/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/msp/signcerts/peer1.org1.example.com-cert.pem -text -nooutX509v3 Subject Alternative Name包含DNS:peer1.org1.example.com(你在datasources.json中使用的请求URL主机名)。 - 如果你的Docker Swarm服务名是
peer1而非完整域名,可能需要修改SDK配置中的requestURL为grpcs://peer1:7051,同时确保证书SAN包含DNS:peer1。
2. 修正配置中的路径问题
你的datasources.json里使用了$HOME变量,但如果fabric-sdk-rest运行在Docker容器中,$HOME指向的是容器内部路径,而非宿主机路径:
- 确保宿主机的
crypto-config目录已经挂载到容器内的指定路径(比如/crypto-config)。 - 将配置中的所有
$HOME/mynetwork/crypto-config替换为容器内的绝对路径,例如:"privateKey": "/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/KEY_sk", "signedCert": "/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem"
3. 完善TLS相关配置
Fabric SDK在TLS模式下需要正确指定Peer的TLS根证书,而非Peer的签名证书:
- 检查
datasources.json中的Peer配置,将publicCertFile替换为Peer组织的CA证书路径(如果用同一个CA签发所有证书):"peers": [ { "requestURL":"grpcs://peer1.org1.example.com:7051", "eventURL":"grpcs://peer1.org1.example.com:7053", "orgIndex":"0", "tlsCACerts": "/crypto-config/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem", "hostname":"peer1" } ] - 同时确认Orderer的配置也使用了正确的TLS CA证书路径。
4. 验证网络连通性与TLS握手
先排除网络层面的问题:
- 在PC2(SDK所在主机)上执行以下命令测试TLS连接:
如果握手成功,说明网络和证书本身没问题,问题出在SDK配置;如果握手失败,先解决Docker Swarm overlay网络的连通性问题,确保Peer的7051端口能被PC2访问。openssl s_client -connect peer1.org1.example.com:7051 -CAfile $HOME/mynetwork/crypto-config/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem
5. 确认版本兼容性
确保fabric-sdk-rest的版本与你使用的Hyperledger Fabric版本完全匹配,不同版本间的TLS配置逻辑可能存在差异,建议使用官方推荐的配套版本。
内容的提问来源于stack exchange,提问作者andrea magagna
相关产品推荐
相关产品推荐

