中装智链国密化修改方案介绍
为什么要用做国密改造?
网络安全形势不容乐观
根据国家互联网应急中心发布的互联网安全威胁报告,仅17年12月,境内被篡改网站数量就达到了4,130个,国家信息安全漏洞共享平台(CNVD)收集整理的信息系统安全漏洞多达1,554个,互联网安全形势仍然很严峻。
“国际通用”已不再安全 越来越多的国际通用密码算法屡屡被传出被破解、被攻击的传闻,存在较高的安全风险。
当前我国金融系统大多采用国外制定的加密算法,存在着大量的不可控因素,一旦被不法分子利用攻击,所产生的损失将不可估量。
国密算法由我国自主研发,已是一些领域的准入门槛 所以在结构中引入国密算法标准,对超级账本项目在国内的商业推广有很重要的作用。
简单介绍国密算法
国密算法是国家通用密码算法的简称,是国家密码管理局制定的自主可控的国产算法,包括SM1、SM2、SM3 、SM4、SM7、SM9、祖冲之密码算法(ZUC)等。
“SM”表示“商密”,即用于商用的、不涉及国家机密的密码技术
在金融领域目前主要使用公开的SM2、SM3、SM4三种商用密码算法,恰好对应上一章的算法种类,分别为非对称加密算法、哈希算法和对称加密算法:
- SM2为基于椭圆曲线密码的公钥密码算法标准,包含数字签名、密钥交换和公钥加密,用于替换RSA / Diffie-Hellman / ECDSA / ECDH 等国际算法。
- SM3为密码哈希算法,用于替代MD5 / SHA-1 / SHA-256等国际算法。
- SM4为分组密码,用于替代DES / AES等国际算法。
SM2,SM3,SM4现在是公开标准,可以在公开渠道获取到算法细则,网上也有不同语言版本的实现可以参考,原理也比较复杂,我们也无需重复造轮子,直接用别人的代码(我们使用苏州同济区块链研究院实现的代码)就可以了。等到有空的时候,再去研究到底是怎么回事。
改造思路
1、代码主要主体:Fabric、Fabric-ca和Fabric-go-sdk2、需要支持代码国密SM2/SM3/SM4算法以及国密SSL/TLS通讯协议。3、GRPC国密改造4、国密链码改造5、Fabric-go-sdk国密改造国密改造设计功能点:
A)、证书支持国密算法 B)、fabric-ca支持生成国密证书。 C)、cryptogen工具支持国密证书D)、其它部分代码支持使用国密证书。 E)、区块链采用SM3哈希F)、智能合约的签名和验签采用SM2/SM3 G)、国密SSL协议: a)Order节点和Peer节点之间通讯 b)合约容器和Peer节点之间。 c)SDK和order/Peer节点 d)Fabric-ca-client和fabric-ca-server. H)、MSP采用SM2证书,国密TLS/SSL通讯协议国密算法支持
针对国密算法的支持,我们实现了对应国密算法库,在fabric密码调用的部分,添加国密的支持。针对国密证书,我们也提供了对应的库,扩展了原有功能,支持国密算法,这部分修改主要是将fabric中的库路径切换为我们提供的库。
国密证书支持
针对国密证书,在配置好fabric国密的算法后,再进行生成国密相关证书
国密grpc支持
针对国密grpc,将原有grpc的文件替换为支持国密的grpc库。
国密链码和Fabric-go-sdk国密支持。
Fabric-go-sdk主要是一个区块链的大框架,每一个应用发布上去,可以调用我们提供的SDK的功能。而Client-SDK现在有很多种版本,主要以下几个方面改造:
- API:主要是接口的定义 PKG:主要是接口的实现 Vendor:替换对Fabric包的引用,提供对国密算法的支持,这一点同CA类似。
国密版本编译
编译:
- 在fabric的原始版本上修改国密版本,进行docker bin文件编译,
- cryptogen generate —gm
常用命令
- make native进行编译
- make docker打包docker镜像
国密内部网络tls通信问题解决方案
在改造了国密的tls加密方案后,单机访问是正常的,但是在多台服务器部署的时候出现了网络无法访问的问题,在指定了docker容器内hosts peer内部访问域名,还是走的外部网络,查找几天网络问题无解 晚上的时候突然想到swarm可以提供多个node节点网络通信的问题,于是乎试着尝试
1.更改docker-compose.yaml启动文件
在docker-compose.yaml文件中,增加external: true代码,表示存在该网络就不再进行创建,byfn是我们要使用的网络名称,可以自定义
networks: byfn: external: true2.创建docker swarm 网络
- 初始化docker swarm ,在master节点执行
docker swarm initdocker swarm join-token manager //以管理员身份获取加入节点
- 输出就会像是:
复制这段代码在所需要部署的服务器执行 可以在master节点使用docker swarm join — token SWMTKN-1–3as8cvf3yxk8e7zj98954jhjza3w75mngmxh543llgpo0c8k7z-61zyibtaqjjimkqj8p6t9lwgu 192.168.245.235:2377
docker node list命令查看已加入的节点 - 创建swarm 网络
docker network create --attachable --driver overlay byfn
- 启动服务
2.couchdb数据库重新设置
- 注意:如果不进行该设置会导致通道创建失败和链码无法安装等问题 为每个peer对应的docker-compose.yaml启动文件couchdb设置不同的名称,避免多个peer访问同一个数据库导致的错误
volumes: couchdb4.finebaas.com:networks: byfn: external: trueservices: couchdb4.finebaas.com: container_name: couchdb4.finebaas.com image: hyperledger/fabric-couchdb # Populate the COUCHDB_USER and COUCHDB_PASSWORD to set an admin user and password # for CouchDB. This will prevent CouchDB from operating in an "Admin Party" mode. environment: - COUCHDB_USER=admin - COUCHDB_PASSWORD=finebaas ports: - 5984:5984 networks: - byfnfabric 部署脚本
cd /home/go/src/finebaasFabric/fabric && ./stop.sh
cd /home/go/src/finebaasFabric/fabric && ./stop.sh && ./start.sh
cd /home/go/src/finebaasFabric/fabric && ./start.sh
rm -rf /home/go/src/finebaasFabric/fabric/data/orderer.finebaas.com/*
&& rm -rf /home/go/src/finebaasFabric/fabric/data/orderer1.finebaas.com/*
&& rm -rf /home/go/src/finebaasFabric/fabric/data/orderer2.finebaas.com/*
&& rm -rf /home/go/src/finebaasFabric/fabric/data/orderer3.finebaas.com/*
&& rm -rf /home/go/src/finebaasFabric/fabric/data/orderer4.finebaas.com/*
&& rm -rf /home/go/src/finebaasFabric/fabric/data/orderer5.finebaas.com/*
&& rm -rf /home/go/src/finebaasFabric/fabric/data/peer1.org2.finebaas.com/*
&& rm -rf /home/go/src/finebaasFabric/fabric/data/peer0.org2.finebaas.com/*
&& rm -rf /home/go/src/finebaasFabric/fabric/data/peer0.org1.finebaas.com/*
&& rm -rf /home/go/src/finebaasFabric/fabric/data/peer1.org1.finebaas.com/*
cd /home/go/src/github.com/hyperledger/fabric-gm-docker && docker save -o fabric-orderer:2.2.0.tar hyperledger/fabric-orderer:2.2.0 && docker save -o fabric-peer:2.2.0.tar hyperledger/fabric-peer:2.2.0 && docker save -o fabric-tools:2.2.0.tar hyperledger/fabric-tools:2.2.0 && docker save -o fabric-ca
cd /home/docker-images/fabric-gm-docker && docker load < fabric-orderer:2.2.0.tar && docker load < fabric-peer:2.2.0.tar && docker load < fabric-tools:2.2.0.tar && docker load < fabric-tools:2.2.0.tar && docker load < fabric-ca
cd /home/go/src/finebaasFabric/fabric && ./start.sh
cd /home/go/src/finebaasFabric/fabric && ./stop.sh && docker container prune && docker images prunne && docker volume prune && ./start.sh
cd /home/go/src/finebaasFabric/fabric && ./stop.sh && docker container prune && docker images prunne && docker volume prune
cd /home/go/src/finebaasFabric/fabric && ./stop.sh && docker container prune && docker images prunne && docker volume prune && docker rmi -f $(docker images -q)
docker rmi -f (docker images -q)
&& ./start.sh
cd /home/go/src/finebaasFabric/fabric && ./stop.sh && rmove /home/go/src/finebaasFabric/fabric /home/go/src/finebaasFabric/fabric_gm
参考文章:
https://www.cnblogs.com/laolieren/p/hyperledger_fabric_gm_summary.html