Hyperledger Fabric的账户体系是建立在PKI之上的MSP,因此,在学习之前,需要先对这个体系进行了解,才能深入的明白MSP是如何保证组织/节点和用户之间的互信通信的。
PKI是Public Key Infrastructure的首字母缩写,翻译过来就是公钥基础设施;PKI是一种遵循标准的利用公钥加密技术为电子商务的开展提供一套安全基础平台的技术和规范。
PKI相关的概念可以在基于PKI的CA认证中心的设计与实现的第二章进行快速的了解;或者阅读5分钟让你知道什么是PKI进行一个简要了解。本节的目的是使用openssl工具自己建设一个CA,可以对客户端生成的密钥对进行签名,为其发放证书。
安装openssl
ubuntu下安装openssl的方法很简单,只需要执行下面两个命令:
sudo apt-get install openssl
sudo apt-get install libssl-dev
# 验证是否安装成功
openssl -v
创建CA根证书
在PKI体系下,CA在发放证书之前,需要先创建一个自己的CA根证书。
我们先创建一个文件夹openssl
,里面有两个子文件夹ca
和client
,分别保存ca和client的相关密钥和证书文件。创建CA根证书的操作都是在ca
目录下完成的。
1.生成私钥
cd ca
openssl genrsa -out private.key 2048
上面的命令在ca
文件夹生成了一个private.key的文件,里面保存了我们指定的2048位的rsa私钥,由于openssl的私钥保存了足够的信息(RSA原理),可以推导出其对应的公钥,具体的导出也有相应的命令。
2.自签名
在PKI体系中,CA的签名可以自签名或从父CA获取,这取决于设计的架构。在本例中,我们使用自签名的方式创建CA的根证书
openssl req -new -x509 -key private.key -out root.crt
上面的命令会根据私钥生成一个自己签名的证书root.crt
有了证书之后,我们可以使用下面的命令查看证书信息
openssl x509 -in root.crt -text | less
3.初始化证书库
对于CA来说,需要记录其已经发放的证书,因此需要先初始化相关的文件,在ubuntu中,openssl的配置文件在/usr/lib/ssl/openssl.cnf
中,内有一个属性dir
是CA保存证书记录的地方,我们可以修改这个地址,之后执行下面的命令:
# 进入cnf中的dir文件夹,创建文件
cd `dir`
ouch index.txt && touch serial && echo 01 > serial
客户端向CA请求证书
客户端相关的操作都在client
目录中处理
1.生成密钥
与上面的操作类似,先生成私钥文件
openssl genrsa -out private.key 1024
2.创建证书请求文件
根据私钥文件,生成证书请求文件CSR,CSR中一般会包含请求者的公钥,这里的请求者就是客户端,由于客户端的私钥文件可推导出公钥,再加上下面的命令执行时要求输入的组织信息,就可以生成CSR了。
openssl req -new -out client.csr -key private.key
查看CSR文件信息
openssl req -in client.csr -text | less
3.从CA获取证书
由于CA相关的数据在ca
文件夹,我们先切换到ca
中,然后对csr文件进行处理,生产发放给客户端的证书
cd ../ca
openssl ca -in ../client/client.csr -out ../client/client.crt -days 365 -keyfile private.key -cert root.crt
ca命令可以用来发放证书,-in指定了输入的csr文件,-out是发放给客户端的证书 -keyfile是ca的根证书私钥文件,-cert是CA的根证书
至此,我们完成了客户端证书的发放,发放完成后,需要对客户端证书和CA的根证书进行验证
校验证书
openssl verify -CAfile ca1/root.crt client/client.crt
如果返回OK,说明证书校验成功。
client/client.crt: OK
客户端A有了自己的证书之后,就可以在通信时将自己的证书发送给客户端B,客户端B拿到证书后,与CA的根证书进行校验,通过后可以从证书中提取客户端A的公钥,然后对要发送给A的数据进行加密,客户端A收到数据后,使用自己的私钥进行解密后就可以看到信息了。