Fabric-CA主要是为了实现对加入联盟链的成员的身份控制以及数据生成保管。
CA即Certificate authority,证书授权者,就是颁发证书的机构。
CA考虑通过Fabric-CA来做搭建,改造CA主要改动如下几个包:
•Lib:主要是接口的实现,主要在解析申请证书请求以及签发证书流程要替换为国密算法;
•Util:该包数据工具类,主要在证书的编解码等操作中扩展国密算法;
•Vendor:因为CA沿用Fabric中的BCCSP套件,所以需要替换对Fabric的包的引用,提供对国密算法的支持。
下面尝试使用国密算法改造过的fabric bccsp来产生证书。
lib/util.go
util/configurebccsp.go
lib/ca.go
lib/gmca.go
另外,依赖的库文件都需要换成国密算法的库文件。
采用cryptogen工具来生成证书:
cryptogen工具会读取 crypto-config.yaml中的所有配置,把内容解析到名为 OrdererOrgs和 PeerOrgs的数据结构中,其实这两个对应的就是crypto-config.yaml 中的两个根节点或是一级节点(这里是把yaml看成和xml一样的文件格式),这两个的类型为OrgSpec,类型的定义如下:
type OrgSpec struct {
Name string `yaml:"Name"`
Domain string `yaml:"Domain"`
EnableNodeOUs bool `yaml:"EnableNodeOUs"`
CA NodeSpec `yaml:"CA"`
Template NodeTemplate `yaml:"Template"`
Specs []NodeSpec `yaml:"Specs"`
Users UsersSpec `yaml:"Users"`
}
//生成证书工具在目录e2e_cli目录下
cd examples/e2e_cli
//调用e2e的工具生成证书
./generateArtifacts.sh
注:命令执行成功后,会在e2e_cli目录下产生文件夹crypto-config。
在这个MSP中配置了两个组织(org1/org2)
每个组织下有两个peer节点(peer0/peer1):排序服务节点/CA节点
以peerOrganizations组织树为例,打开该目录,可以看到如下两个组织的证数目录:
每个组织都会生成单独的根证书。
ca :存放了组织的根证书和对应的私钥文件,采用的是SM2算法,证数为自签名(自已签发自己的公钥)。组织内的实体将基于该证数作为证数根。
密钥
根CA证书
msp:存放代表该组织的身份信息。
被根证书签名的组织管理员的身份验证证书。
组织的根CA证书,和ca目录下的文件相同。
用于TLS的根CA证书,证数为自签名。
peers:存放该组织下所有peer节点的证书:
·msp:
admincerts:组织管理员的身份验证证书,用于验证交易签名者是否为管理员身份
cacerts:存放组织的根证书。
keystore:本节点的身份私钥,用来签名。
signcerts: 验证本节点签名的证书,被组织根证书签名。
tlscacerts:TLS连接用的身份证书,即组织TLS证书。
·tls:存放tls相关的证书和私钥。
ca.crt:组织的根证书。
server.crt:验证本节点签名的证书,被组织根证书签名。
server.key:本节点的身份私钥,用来签名。
users:存放属于该组织的用户实体。一般包含一个管理员和一个普通成员:
·msp:
admincerts:MSP的管理员证书
cacerts:MSP的根CA证书
keystore:签名密钥
signcerts: 节点的签名证书
tlscacerts:TLS的根CA证书
·tls:存放tls相关的证书和私钥。
ca.crt:可信的根CA证书
server.crt:用来进行TLS连接的证书
server.key:用来进行TLS连接的密钥
openssl x509 -in ca-cert.pem -noout -text
验证节点的证书:
使用CA的公钥对server.crt内含的密文进行解密(使用算法为SM2),然后将得到的明文进行hash(使用算法为SM3),得到摘要h1。
将明文用SM3算法进行哈希,然后将得到的摘要h2使用节点的私钥server.key进行加密,再用server.crt内含的公钥进行解密。如果h1与h2相同,则证明证书有效。