由于官方例程无法满足我们的项目需要,所以在Fabric1.4提供的BYFN的例程基础之上,按照项目需要修改相关证书。
一. 修改证书里面的相关配置字段
首先需要修改证书里面关于国家、省市等一些基础信息,下面两张图片表示修改前后的对比:
为实现上述修改,需要修改配置文件crypto-config.yaml,增加内容如下图所示:
在原配置文件中,并没有指定CA关于CSR字段的相关内容,阅读源码可知,其CSR相关字段采用缺省值。如果在crypto-config.yaml中指定了CSR字段的相关内容,则使用配置文件中的内容。
修改后的效果如前面截图所示。
配置文件一共需要修改三处,Order节点、Peer节点的Org1和Org2。
Order节点只需增加三项:Country、Province、Locality,分别代表国家、省、市。
在修改Peer节点的Org1和Org2时,在上面修改的基础上,还增加了StreetAddress选项,临时充当一个自定义选项,来区分铸币行、清算行等。
以后若项目需要,可研究如何增加扩展选项。
二. 修改注意事项
本章节介绍在修改配置文件时,遇到的几个问题。
2.1 使用OU
曾经想使用OU选项作为自定义项,但发现Peer节点已使用了OU选项,来区分是Peer还是Client。如果强行在crypto-config.yaml指定了OU,则证书中会出现两个OU。
本人曾经试图把EnableNodeOUs关掉,这样就不会出现2个OU,同时也可以正常生成证书,但是无法通过后续的byfn(build your first network)的测试。
因为如果设置了EnableNodeOUs,就在msp目录下生成config.yaml文件。如果把EnableNodeOUs关掉,会让生成的证书不全,导致不能通过后续测试。
2.2 注意缩进的格式
在修改配置文件时,必须用空格缩进,不要使用TAB键,否则会导致解析脚本文件出错。
在最初修改时,由于没有注意这个细节,导致有时配置文件可修改成功,有时不行。后来仔细阅读出错的提示,才发现此原因。
2.3 修改配置文件的作用范围
在配置文件config.yaml中修改了CSR相关字段后,会同时影响颁发者(Issuer Name)和使用者(Subject Name)的相关字段。
在实际应用过程中,颁发者和使用者的相关字段是不同的,此处为简化处理。
三. 证书和公私钥简介
本章节介绍证书和公私钥的相关概念。
证书代表身份,用来在实体间进行通信以及交易的时候进行签名与验证身份。
查看证书文件(数字证书是经过CA认证过的公钥)的标准为X.509,编码格式为pem,以-----BEGIN开头,以-----END结尾。
X.509数字证书不但包括用户名和公共密钥,而且还包括有关该用户的其它信息。数字证书除了扩展名为PEM,也可以是CRT、KEY。
CRT:Certificate缩写,PEM编码格式。
KEY:用来存放一个公钥或私钥,并非X.509证书,PEM格式。
证书的默认签名算法为ECDSA,Hash算法为SHA-256。
Fabric中涉及了以下类型证书:
登记证书(ECert):颁发给提供了注册凭证的用户或节点实体,长期有效。(主要就是通ECert对实体身份检验)
通信证书(TLSCert):TLS证书用来保障通信链路安全,控制对网络层的接入访问,可以对远端实体身份校验,防止窃听。
在ChainCode里可以通过shim API的GetCreator函数提取调用当前交易的客户端的证书,使用GO语言的pem包将证书解码,然后使用x.509包解析证书中的信息。
四. 生成证书和公私钥的过程
4.1 生成节点的CA证书。
创建 crypto-config/peerOrganizations/{domain}/ca 目录,例子中为org.example.com。根据yaml:CA的配置,使用fabric的加密服务提供程序(bccsp),生成P256的椭圆加密算法的私钥和公钥,然后使用ca中指定的 country, province,common name等信息生成包含公钥信息的ca.org2.example.com-cert.pem 文件。
4.2 生成tls的证书。
同上面的ca证书,只不过tls证书中的common name为 tlsca, 而上面的ca证书中的common name为ca。
4.3 导入到MSP
把ca下的证书和tls证书导入到crypto-config/peerOrganizations/org2.example.com/msp/cacerts和crypto-config/peerOrganizations/org2.example.com/msp/tlscacerts下
4.4 生成配置文件
如果设置了EnableNodeOUs,就在msp目录下生成config.yaml文件
4.5 创建本地msp
根据配置的节点信息,为每一个节点创建本地的msp, 包括两部分:
第一部分为创建peers/{commonName}/msp 。具体为:
peers/peer0.org2.example.com/msp 和
peers/peer1.org2.example.com/msp
这部分证书都是通过CSP(Cryptographic Service Provider:加密服务提供者) 产生一个keystore私钥,然后使用这个私钥对应的公钥生成admincerts,cacerts,signcerts 的证书。而cacerts下的证书和peerOrganizations/{domain}/ca下ca.{domain}-cert.pem是完全一样的。tlscacerts 下的证书也和{domain}下其他的tlscacerts文件夹下的证书完全一致。
第二部分是生成peers/{commonName}/tls目录下的公私钥证书,具体为:peers/peer0.org2.example.com/tls
peers/peer1.org2.example.com/tls
这部分证书是重新生成的。包含一个ca证书,一个公钥证书和一个私钥证书。如果节点类型为 client,就生成客户端的公钥证书和私钥证书,如果节点类型为orderer或是peer类型,就生成服务端相关的证书。
私钥存在serer.key内。ca.crt是把证书内容通过x509.ParseCertificate转换得到,而server.crt是通过把写入了证书内容的pem文件直接重命名成crt文件得到。
4.6 生成用户证书
根据配置的yaml:Users下的yaml:Count 的数目,来为每个用户生成用户信息,生成的内容和步骤和上一节完全一致。
用户名的生成规则为:从1开始循环递增到Count, 每个用户名为:"User" + index + @ + Domain , 例子中就为:User1@org2.example.com。默认会有一个admin用户。
4.7 复制管理员证书
把user目录下的signcerts 作为admincerts copy到org1.example.com/msp/admincerts和org1.example.com/peers/{CommonName}/admincerts下。
到此,节点相关的所有证书信息已经生成。
生成orderer相关的证书信息,过程和节点完全类似的。
五. 证书的结构
5.1 组织的证书结构
每个组织都会生成单独的根证书。相关的子目录有5个(可在Ubuntu中安装Dolphin文件管理器以显示目录树),如下图所示:
(1)ca
ca目录存放组织的根证书和对应的私钥文件,采用EC算法,证书为自签名(自已签发自己的公钥)。组织内的实体将基于该证书作为根证书。
(2)msp
msp目录存放代表该组织的身份信息。
A、admincerts:存放被根证书签名的组织管理员的身份验证证书。
B、cacerts:存放组织的根证书,与ca目录下的根证书文件相同。
C、tlscacerts:用于TLS的ca证数,证书为自签名。
(3)peers(orders)
每个Orderer或Peer节点的证书结构都是相同的,包括msp和tls目录。
(4)tlsca
存放组织的TLS证书。
(5)users
用于存放属于该组织的用户实体。
5.2 Peer节点的证书结构
每个Orderer或Peer节点的证书结构都是相同的,包括msp和tls目录。
(1)msp
admincerts:存放组织管理员的身份验证证书,用于验证交易签名者是否为管理员身份。
cacerts:存放组织的根证书。
keystore:本节点的身份私钥,用来签名。
signcerts:验证本节点签名的证书,被组织根证书签名。
tlscacerts:TLS连接用的证书,即组织的TLS证书。
(2)tls
存放tls相关的证书和私钥。
ca.crt:组织的根证书。
server.crt:验证本节点签名的证书,被组织根证书签名。
server.key:本节点的身份私钥,用来签名。
5.3 用户实体的证书结构
5.3.1 Admin@org1.example.com
存放管理员用户的信息,包括msp目录和tls目录
(A)msp
admincerts:存放管理员证书(Admin@org1.example.com-cert.pem)
cacerts:存放组织的根证书(ca.org1.example.com-cert.pem)
keystore:存放本用户的身份私钥,用来签名
signcerts:存放管理员用户的身份验证证书(Admin@org1.example.com-cert.pem),由组织根证书签名,要放到Peer节点的msp/admincerts下才会被Peer节点认可
tlscacerts:TLS连接用的证书,即组织TLS证书(tlsca.org1.example.com-cert.pem)
(B)tls
ca.crt:组织的根证书
client.crt: 管理员用户的身份验证证书,由组织根证书签名
client.key:管理员的身份私钥,用来签名
5.3.2 User1@org1.example.com
User1是User1用户的信息,包括msp证书和tls证书
(A)msp
admincerts:用户证书(User1@org1.example.com-cert.pem)
cacerts:存放组织的根证书(ca.org1.example.com-cert.pem)
keystore:本用户的身份私钥,用来签名
signcerts:用户的身份验证证书(User1@org1.example.com-cert.pem),由组织根证书签名
tlscacerts:TLS连接用的证书,即组织TLS证书(tlsca.org1.example.com-cert.pem)
(B)tls
ca.crt:组织的根证书。
client.crt: 用户的身份验证证书,由组织根证书签名。
client.key:用户身份私钥,用来签名。