相信很多人和我们一样,开始使用Hyperledger Fabric进行项目是从他的Test-network开始的吧,从最开始的单节点配置到后来扩展到多节点配置。但是基础还是从test-network来的。
进来,一些一年前的项目陆续出现一些问题,让我们发现了fabric里面这个大坑。
那就是TLS证书过期错误。
默认启动Fabric-ca的时候,还挺简单对吧,启动docker之后,程序会自动生成root证书,并根据root证书生成后续需要的tls证书和节点证书。
但是最近出问题之后,我们深入研究了fabric-ca的默认配置文件,发现其中
tls证书有效期默认为1年
enroll证书(各类角色,包括peer,orderer等)的证书有效期是5年。
root ca证书有效期默认是15年。
那经常会遇到问题的就是tls证书过期的问题了。也就是说,项目好端端跑了一年,就会突然遇到证书失效的问题……也是醉了。
解决方案1:重新生成tls证书
(请注意,这个方法成功完成了节点证书重新生成,但是因为提到的这个channel错误并没有最后成功)
删除fabric-ca生成的tls-cert.pem,重新启动ca,就可以重新生成tls证书,但是因为tls证书在各个节点的链接过程中,凡是涉及和ca进行认证交互的部分都需要,这个证书是拷贝到每个结构对应的所有节点了的,所以要逐个节点进行替换。
这样,5年内应该是没有问题了,5年之后,要重新执行enroll指令,为各个节点重新申请enroll证书,就可以完成续命。
经测试,在删除节点配置文件的tls文件夹之后,遇到了"channel xxx is not serviced by me"问题,经查,似乎和2.3以前版本需要创建consortium有关,这有个类似的问题
Re: identity and tls certs expired in Hyperledger fabrichttps://lists.hyperledger.org/g/fabric/message/10265但是也有可能是因为我删除的tls中有其他文件导致,fabric的安全体系太复杂,建议搜到这篇文章的小伙伴,一定要采用2.3版本以上的无consortium配置。
解决方案2:重新部署
如果你的项目数据没有需要保存的,可以采取重新部署的方式(我们试验过,只要root ca变化过,保留数据和system-genesis-block下的创世块是行不通的,所有数据的验证都依赖于root ca)。
重新部署的时候,可以手工生成一份fabric-ca-server-config.yaml(各机构一份),各机构配置中不同的部分包括name和host等。可以拷贝默认生成的yaml文件,进行二次手工编辑。
但是经研究,系统生成的fabric-ca-server-config.yaml中,csr的hosts部分包含了docker机器的hostname,用于后续在docker环境中的互联互通。
csr:
hosts:
- 3a913f6002ef
- localhost
如果要自己手工编写的话,获得这个hosts有两个办法:
1)确认docker的container's ID,通常docker的hostname就是container id
2)在docker-compose.yaml中配置每个节点的hostname
推荐采用第二种方式,这样,我们可以把hostname设置为更有意义的域名,例如peer1,org1.example.com等
----------------------------------------------------------
今天又有一个小伙伴遇到这个问题,特别提醒任何修复操作注意备份原证书。