Fabric CA国密版本的一种替代方案--使用cryptogen工具增加新用户

在Fabric超级账本中,如果我们想动态增加用户发行证书,一般会使用Fabric CA或者其它CA。然而在国密改造场景中,当前缺乏可用的开源的Fabric CA国密版本。因此,笔者研究了一下,发现了一种可不使用CA直接使用cryptogen来生成新证书的方法,暂时减弱对Fabric CA国密版本的需求。同时,拓展开去,因为此方法没有版本限制,因此个人认为也可用于Fabric 2.0及以上版本的国密改造。

一、前提

最近由于工作需求,尝试了一下Fabric 超级账本的国密改造应用(仅只是应用,未涉及底层改造)。当前Fabric超级账本国密改造其实分为三大块:Fabric源码,Fabric SDK和Fabric CA。前两个部分的国密改造网上已经有开源的版本了(风险自负),具体使用方法见我的另外两篇文章:

而可用的开源的Fabric CA国密版本却一直找不到。网上已经有的开源的Fabric CA国密版本都有这样或者那样的问题,要么无法和cryptogen工具生成的证书互通,要么使用起来有问题。当然不排除有未开源的可用的Fabric CA国密版本,但是目前对我来说,需要一个免费的并且可用的Fabric CA国密版本。

–这里打个广告,关于cryptogen和Fabric CA证书互通问题,见我的另一篇文章:超级账本中 cryptogen和Fabric CA证书互通问题

二、需求

但是我们为什么要用国密版的CA呢,使用过fabric-samples测试网的读者都知道,比如first-network网络启动时默认使用cryptogen生成证书,但是它生成的证书数量是固定的。如果你想添加一个新用户,你可以更改配置中证书的数量,然后重新生成。但是重新生成后就是新的证书,原来的证书无法使用了。这里使用CA就比较方便,你可以随时新增用户而不影响整个网络。

但是问题出现了,目前在Fabric国密改造的需求中,找不到开源的可用的Fabric CA国密版本。当然我们也可以不用CA,比如使用cryptogen工具在网络启动时直接发行100个用户,也就够用了。但这样做总是有些low。

我们知道,一个证书发行机构不管是Fabric CA还是cryptogen,只要它们的私钥和根证书相同,它们就是同一个CA,那么利用这一点我们能不能反其道而行之呢?既然Fabric CA不可求,那我们就不使用Fabric CA,何不尝试使用cryptogen利用已经生成的私钥和根证书来发行属于同一机构的证书呢?

三、实现

说干就干,既然想使用cryptogen,就先看下它能做什么。直接在fabric-samples/bin目录下运行./cryptogen help,会得到下面的输出:

usage: cryptogen [<flags>] <command> [<args> ...]

Utility for generating Hyperledger Fabric key material

Flags:
  --help  Show context-sensitive help (also try --help-long and --help-man).

Commands:
  help [<command>...]
    Show help.

  generate [<flags>]
    Generate key material

  showtemplate
    Show the default configuration template

  version
    Show version information

  extend [<flags>]
    Extend existing network

咦,有个extend子命令,意思为扩展存在的网络,看来有戏。去官方文档看下这个命令的详细介绍:
在这里插入图片描述
看介绍它是用来拓展网络的,虽然示例中是增加了一个组织,但是总得尝试一下。

于是进入 fabric-samples/first-network目录,直接运行./byfn.sh up,启动测试网络。注意这里我们生成的新用户需要测试,所以需要参考我那篇SDK使用的文章,先启动国密版的测试网络并且接入国密SDK测试通过。

然后因为byfn.sh脚本中是生成子命令:cryptogen generate --config=./crypto-config.yaml 我们要改成extend子命令。而所以根据上图的示例,首先我们得创建一个new-org1-config.yaml,内容就是crypto-config.yaml中只包含org1的部分,并且将用户数量改为3(除管理员外),如下所示:

# ---------------------------------------------------------------------------
PeerOrgs:
  # ---------------------------------------------------------------------------
  # Org1
  # ---------------------------------------------------------------------------
  - Name: Org1
    Domain: org1.example.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 3

保存退出后,在网络启动的情况下,我们在first-network目录下运行

../bin/cryptogen extend --config=./new-org1-config.yaml

屏幕会有类似的输出:

hehehehe &{
    
    {
    
    57896044551258231062740198220913455226441901632205615997740090104278065086466 0xc00007c140 [536870905 268435455 895 268428288 536870911 268435455 536870911 150994943 268435455] [394377860 220399154 355969936 163370829 236861671 88177300 303341152 24396229 75627569] [137364797 52992271 113266657 202339045 31563580 107393171 24488059 247693942 35835723] [408558522 55895443 311818945 254526569 75260154 203012265 258167614 151236203 209300666]} 93322454353996403820296961564506544728212789716739747136454365915828308484093 6966228001545439549108757395662279044399389641667730857900146482088229055896}
hehehehe &{
    
    {
    
    57896044551258231062740198220913455226441901632205615997740090104278065086466 0xc00007c140 [536870905 268435455 895 268428288 536870911 268435455 536870911 150994943 268435455] [394377860 220399154 355969936 163370829 236861671 88177300 303341152 24396229 75627569] [137364797 52992271 113266657 202339045 31563580 107393171 24488059 247693942 35835723] [408558522 55895443 311818945 254526569 75260154 203012265 258167614 151236203 209300666]} 30306800224514377016096554966983804996273193405862204168872079179630755829514 92380653969940809229613336050795378666932279691927801513843736432124786976274}
hehehehe &{
    
    {
    
    57896044551258231062740198220913455226441901632205615997740090104278065086466 0xc00007c140 [536870905 268435455 895 268428288 536870911 268435455 536870911 150994943 268435455] [394377860 220399154 355969936 163370829 236861671 88177300 303341152 24396229 75627569] [137364797 52992271 113266657 202339045 31563580 107393171 24488059 247693942 35835723] [408558522 55895443 311818945 254526569 75260154 203012265 258167614 151236203 209300666]} 4311683100071045748705022318436765074509955434317854120607477640429312740432 99882041785790063772976559666758032554047899796398476617595580203019199906461}
hehehehe &{
    
    {
    
    57896044551258231062740198220913455226441901632205615997740090104278065086466 0xc00007c140 [536870905 268435455 895 268428288 536870911 268435455 536870911 150994943 268435455] [394377860 220399154 355969936 163370829 236861671 88177300 303341152 24396229 75627569] [137364797 52992271 113266657 202339045 31563580 107393171 24488059 247693942 35835723] [408558522 55895443 311818945 254526569 75260154 203012265 258167614 151236203 209300666]} 18113313443822832374468548508152336351389244341164675859983815020626652461706 76852597410980258905261680766762896262700409724285143957744057129835174169268}

好了,这时查看相应的用户目录,如下图:
在这里插入图片描述

四、测试

到此,我们的新用户就生成了,可以看到多了两个用户。让我们来测试一下:

  • 旧用户是否被改写
  • 新用户是否有效

根据我的国密GO-SDK使用的文章,打开main.go,可以看到当前用户是User1,直接运行go run main.go,会得到结果为90,证明我们旧用户是有效的。然后我们将User1改成User3,再次运行go run main.go,仍然会得到结果为90,证明我们新用户是有效的。

其实我们也可以将使用../bin/cryptogen extend --config=./new-org1-config.yaml前后的Admin用户和User1用户作一下对比,可以发现它们是一模一样的。从前面的输出结果可以猜测(它有四行输出),它应该是根据某种固定规则生成的证书,所以前面重复的用户生成了相同的证书。这个比较我已经做过了,就不在这里列出了。

好了,使用cryptogen替代Fabric CA发行新用户就是这么简单。不过,它的应用场景用限,远没有CA使用广泛,它只能作为没有CA时的替代方法。

虽然我们还是要继续追求 Fabric CA 国密版,不过有东西能用就行,不是么… _

五、展望

因为此替代方法没有版本限制,也就是说可应用于Fabric 2.0及以上版本的国密改造。当前,网安已经开源了Fabric 2.0源码的国密版本,如果按照这个思路可以进行相应的Fabric CA或者其它CA的替代,那么Fabric 2.0的国密改造从可用性上来讲,就只剩下sdk的国密改造了。

猜你喜欢

转载自blog.csdn.net/weixin_39430411/article/details/108249335