Corda 1.0重新部署带已有数据的节点启动时出现SSL握手超时错误
问题场景
我目前仍在使用Corda 1.0版本,尝试重新部署带有已有数据的节点时,启动阶段出现如下错误,但仍能正常访问节点。若清空数据后重新部署节点,则不会出现此类错误。
错误日志详情:
Logs can be found in : C:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\kotlin-source\build\nodes\xxxxxxxxx\logs Database connection url is : jdbc:h2:tcp://xxxxxxxxx/node E 18:38:46+0530 [main] core.client.createConnection - AMQ214016: Failed to create netty connection javax.net.ssl.SSLException: handshake timed out at io.netty.handler.ssl.SslHandler.handshake(...)(Unknown Source) ~[netty-all-4.1.9.Final.jar:4.1.9.Final] Incoming connection address : xxxxxxxxxxxx Listening on port : 10014 RPC service listening on port : 10015 Loaded CorDapps : corda-finance-1.0.0, kotlin-source-0.1, corda-core-1.0.0 Node for "xxxxxxxxxxx" started up and registered in 213.08 sec Welcome to the Corda interactive shell. Useful commands include 'help' to see what is available, and 'bye' to shut down the node. Wed May 23 18:39:20 IST 2018>>> E 18:39:24+0530 [Thread-6 (ActiveMQ-server-org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl$3@4a532271)] core.client.createConnection - AMQ214016: Failed to create netty connection javax.net.ssl.SSLException: handshake timed out at io.netty.handler.ssl.SslHandler.handshake(...)(Unknown Source) ~[netty-all-4.1.9.Final.jar:4.1.9.Final]
问题分析
这个错误是Corda底层依赖的ActiveMQ Artemis消息中间件在建立内部SSL连接时握手超时导致的。节点能正常访问是因为核心业务服务已经完成初始化,这个超时只影响了Artemis的部分内部连接,暂时不干扰核心功能。而清空数据后恢复正常,说明问题和节点本地存储的旧连接状态、Artemis缓存数据直接相关。
解决方案
我整理了几个针对Corda 1.0版本的可行修复步骤,建议按优先级尝试:
清理Artemis旧消息存储
Corda节点的Artemis消息数据默认存放在节点目录下的artemis文件夹中。停止节点后,删除这个文件夹(注意不要误删persistence或certificates等业务相关目录),然后重新启动节点。节点会自动重建干净的Artemis存储,不会丢失你的业务数据(业务数据存在H2数据库的persistence目录里)。调整SSL握手超时时间
在节点的node.conf配置文件中,找到p2p或rpc配置块,添加SSL握手超时配置:p2p { ssl { handshakeTimeout = 30000 } } rpc { ssl { handshakeTimeout = 30000 } }把超时时间从默认的10秒调整到30秒,给握手过程预留更多时间完成。
检查端口占用情况
日志里显示节点监听10014(P2P端口)和10015(RPC端口),确保这些端口没有被其他进程占用:- Windows系统用命令:
netstat -ano | findstr "10014" - Linux/Mac系统用命令:
lsof -i :10014
如果发现端口被占用,终止对应进程后重启节点。
- Windows系统用命令:
验证节点证书有效性
旧数据中可能存在过期或损坏的SSL证书。检查节点目录下certificates文件夹中的证书文件,确认它们没有过期。如果证书有问题,可以通过Corda的generateNodeInfo和initialiseNode命令重新生成节点证书。
额外建议
你使用的Corda 1.0是非常早期的版本,这类底层组件的兼容性问题在后续的Corda版本中已经被大量修复。如果业务允许,建议逐步升级到较新的稳定版本(比如Corda 4.x),能从根本上减少这类问题的发生。
内容的提问来源于stack exchange,提问作者viswa

