1700 字
9 分钟
中装智链国密化修改方案介绍

中装智链国密化修改方案介绍#

为什么要用做国密改造?#

网络安全形势不容乐观

根据国家互联网应急中心发布的互联网安全威胁报告,仅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-sdk
2、需要支持代码国密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: true

2.创建docker swarm 网络#

  • 初始化docker swarm ,在master节点执行
    docker swarm init
    docker swarm join-token manager //以管理员身份获取加入节点
  • 输出就会像是:
    docker swarm join — token SWMTKN-1–3as8cvf3yxk8e7zj98954jhjza3w75mngmxh543llgpo0c8k7z-61zyibtaqjjimkqj8p6t9lwgu 192.168.245.235:2377
    复制这段代码在所需要部署的服务器执行 可以在master节点使用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: true
services:
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:
- byfn

fabric 部署脚本#

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.tar hyperledger/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 (dockerimagesq)dockerrmi(docker images -q) docker rmi (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

中装智链国密化修改方案介绍
https://blog.zhequtao.com/posts/golang/go-block/fabric-gm/gm/
作者
阿俊
发布于
2021-10-15
许可协议
CC BY-NC-SA 4.0

相关阅读