HyperLedger Fabric 和 Docker Swarm:握手失败,出现致命错误 SSL_ERROR_SSL

如何解决HyperLedger Fabric 和 Docker Swarm:握手失败,出现致命错误 SSL_ERROR_SSL

我们正在尝试在运行 API 服务器(基于 Node.js)的 docker 容器和运行 的另一个 docker 容器之间建立 grpcs (TLS) 连接peer0 来自 Fabric 网络。 所有容器都由 docker swarm 编排,并且两个容器恰好在同一 Linux 主机上运行。

API 容器抛出的错误日志如下:

2021-01-07T18:27:38.110Z - 错误:[Remote.js]:错误:未能 在截止日期前连接 URL:grpcs://10.0.1.2:9051 Query has 已完成,从查询检查结果错误 = { 错误:未能 在截止日期前连接 URL:grpcs://10.0.1.2:9051 在 checkState (/usr/src/app/node_modules/grpc/src/client.js:833:16) 连接失败: true } sampleEvent 错误:错误:14 不可用:连接失败 E0107 18:27:53.602719124 16 ssl_transport_security.cc:1229] 握手 因致命错误 SSL_ERROR_SSL 失败:错误:14090086:SSL 例程:ssl3_get_server_certificate:证书验证失败。

而peer0抛出的错误日志是:

2021-01-07 18:50:22.224 UTC [core.comm] ServerHandshake -> ERRO 043 TLS 握手失败,错误 EOF server=PeerServer remoteaddress=10.0.1.4:46212

IP 地址布局

  • API 容器的 IP 地址为 10.0.1.94
  • peer0 容器的 IP 地址是 10.0.1.3
  • docker service peer0 的虚拟 IP 地址为 10.0.1.2
  • docker swarm 负载均衡器端点的 IP 地址是 10.0.1.4

有什么建议可以进一步排除故障吗?目前尚不清楚问题是出在 docker swarm 内部网络上,还是出在网络任一端的 ssl 证书上。

2021 年 2 月 2 日更新

通过升级 NodeSDK 中使用的 javascript 修复了原始 TLS 握手错误。除其他外,我们开始使用 commercial-paper 示例

中包含的 addToWallet.js 脚本

在 Node.js API 和 peer0 之间成功建立 TLS 后,我们在对 access denied 进行简单查询时出现新的 chaincode_example02 错误

事实:

  1. 我们正在使用 2 个管理员用户运行查询
  2. One Admin 是 first-network Admin@org1.example.com,凭据由 cryptogen 工具生成
  3. 另一位管理员是 Admin@buyer.dlt.com,其凭据是使用 openssl 和自签名公司内部 CA 创建的
  4. 从 CLI 来看,两个管理员都很好,并且可以交替运行对等命令
  5. 在 Node.js 应用中,仅允许 Admin@org1.example.com 运行查询。打印到 console.log 的消息是:
Transaction has been evaluated,result is: 100

  1. 使用 Admin@buyer.dlt.com 运行查询时,我们会收到以下错误日志:

来自 peer0@buyer.dlt.com

的错误日志
2021-02-02T04:08:45.291086617Z ^[[36m2021-02-02 04:08:45.290 UTC [protoutils] checkSignatureFromCreator -> DEBU 6e637^[[0m creator is &{BuyerMSP 8b7cc2ee996be4f7e5dbb1a4f64db67afd2ff8a2f41276c9bd7f33a2447dd9df}
2021-02-02T04:08:45.291094817Z ^[[36m2021-02-02 04:08:45.290 UTC [protoutils] checkSignatureFromCreator -> DEBU 6e638^[[0m creator is valid
2021-02-02T04:08:45.291100418Z ^[[36m2021-02-02 04:08:45.290 UTC [msp.identity] 2021-02-02T04:08:45.303821799Z ^[[33m2021-02-02 04:08:45.303 UTC [protoutils] ValidateProposalMessage -> WARN 6e63b^[[0m channel [mychannel]: creator's signature over the proposal is not valid: The signature is invalid
2021-02-02T04:08:45.303891604Z ^[[36m2021-02-02 04:08:45.303 UTC [endorser] func1 -> DEBU 6e63c^[[0m Exit: request from 10.0.1.84:52696
2021-02-02T04:08:45.303902005Z ^[[34m2021-02-02 04:08:45.303 UTC [comm.grpc.server] 1 -> INFO 6e63d^[[0m unary call completed grpc.service=protos.Endorser grpc.method=ProcessProposal grpc.peer_address=10.0.1.84:52696 error="access denied: channel [mychannel] creator org [BuyerMSP]" grpc.code=Unknown grpc.call_duration=13.783655ms

从脚本 query.js 登录 console.log 的错误:

2021-02-02T04:08:45.305Z - error: [Channel.js]: Error: 2 UNKNOWN: access denied: channel [mychannel] creator org [BuyerMSP]
2021-02-02T04:08:45.307Z - error: [Network]: _initializeInternalChannel: Unable to initialize channel. Attempted to contact 1 Peers. Last error was Error: 2 UNKNOWN: access denied: channel [mychannel] creator org [BuyerMSP]
Failed to evaluate transaction: Error: Unable to initialize channel. Attempted to contact 1 Peers. Last error was Error: 2 UNKNOWN: access denied: channel [mychannel] creator org [BuyerMSP]

解决方法

最后,这个问题变成了两个问题,“俄罗斯娃娃”风格。

1.第一期:TLS Handshake error 这是通过将 SDK 库升级到最新版本来解决的

2.第二个问题:Node SDK 查询触发错误“The signature is invalid”。 原因原来是 CLI(用 Go 编写)使用 Go 加密支持,它允许它在不了解用于密钥的曲线的情况下从散列生成签名。相反,Node 实现使用的 SDK 库需要由生成签名的代码指定一条特定曲线,与私钥本身分开。 最重要的是,Node SDK 中使用的私钥应该是 P-256。 作为替代方案,正如超级账本开发团队所建议的:

如果你真的必须使用 P-256 以外的曲线,那么你也许可以 使用以下方法之一:

-使用文档中包含的离线签名方法,但指定替代曲线而不是“p256”。支持的曲线 对于此处记录的椭圆包: https://github.com/indutny/elliptic

-在支持网关对象的客户端上设置您自己的 CryptoSuite 实现,使用您自己的 CryptoSuite.sign() 实现: https://hyperledger.github.io/fabric-sdk-node/release-2.2/CryptoSuite.html#sign

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-