区块链之所以被称为“信任的机器”,是因为其通过密码学算法使各不信任的节点互相协作达到信任。这一理念在联盟链中的体现主要是基于PKI(公钥基础设施)建立证书体系,FISCO BCOS中的证书主要满足SSL/TLS加密,通过证书认证的方式,去与特定受信任的“友好”节点连接并通信。
SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS是SSL的标准化后的产物,也是更为安全的升级版 SSL。事实上我们目前用的都是TLS,但因为历史上已习惯了SSL这个叫法。
BCOS证书体系
FISCO BCOS的证书结构中有4种角色,分别是联盟链委员会、联盟链成员机构、联盟链参与方(节点和SDK)。
1. 联盟链委员会
联盟链委员会拥有联盟链的根证书ca.crt和私钥ca.key,通过使用ca.key对联盟链成员机构签发机构证书,负责完成联盟链成员机构的准入、剔除等操作。
2. 联盟链成员机构
联盟链成员机构为经过联盟链委员会许可,加入到联盟链的机构。联盟链成员机构拥有机构私钥agency.key和经过根私钥ca.key签发的机构证书agency.crt。联盟链成员机构可以通过机构私钥签发节点证书,从而配置本机构的节点和SDK。
3. 联盟链参与方
联盟链参与方可以通过运行节点或SDK联盟链交互,拥有与其他节点进行通信的节点证书node.crt和私钥node.key。联盟链参与方运行节点或SDK时,需要加载根证书ca.crt和相应的节点证书node.crt和私钥node.key(不需要机构证书);与其他成员进行网络通信时,使用预先加载的证书进行身份认证。
BCOS证书生成过程梳理
BCOS证书体系与配置流程
联盟链委员会
1.本地生成私钥ca.key;
2. 自签生成根证书ca.crt;
联盟链机构成员
3.本地生成私钥agency.key;
4.由本地私钥生成证书请求文件agency.csr;
5.将证书请求文件agency.csr发送至联盟链委员会;
6.联盟链委员会使用ca.key对证书请求文件agency.csr进行签发,得到联盟链成员机构证书agency.crt,联盟链委员会将联盟链成员机构证书agency.crt发送至对应成员;
节点/SDK
7.本地生成私钥node.key;
8.由本地私钥生成证书请求文件node.csr;
9.将证书请求文件node.csr发送至联盟链成员机构;
10.联盟链成员机构使用agency.key对证书请求文件node.csr进行签发,得到节点/SDK证书node.crt,并将节点证书node.crt发送至对应实体(sdk使用的也是node证书)。
证书验证流程
普通数字证书验证方法是这样,假设有A和B两方通信时A需要验证B,则:
1. A首先需要获取到为B颁发证书的那个CA(Certificate Authority证书颁发机构)的证书(上级CA证书),用这个上级CA证书中的公钥解密证书中的签名,得到“摘要信息1”
2. A再使用B证书中签名算法里面的HASH算法对B证书的数据部分进行HASH计算(如字段Signature Algorithm: ecdsa-with-SHA256,HASH算法为SHA256),得到一个“摘要信息2”。
3. A将摘要信息1和摘要信息2进行对比,如果两者一致,就说明证书确实是由这个上级CA颁发的(能用CA的公钥解密说明该CA确实持有私钥),并且没有被篡改过,说明该证书没有问题。
当然,也会同时检查证书是否在有效期内等参数。
依据上面数字证书的验证过程,总结BCOS链上TLS/SSL证书验证过程:
1.证书加载
节点程序会在本地持有ca.crt(链证书)、agency.crt(机构证书)等相关上级证书。在程序启动时,会首先加载本地的ca.crt和node.crt(节点证书);
2.验证node.crt来源是否合法
当节点验证对方的证书时,会首先使用对方node.crt中的HASH算法计算对方的证书数据部分HASH值;之后节点再使用agency.crt中的信息解密node.crt中的签名,两部分计算结果比对来确定是否为合法agency签发;
3.验证agency.crt来源是否合法
最后节点会使用本地加载ca.crt中的信息验证agency.crt是否为联盟链委员会签发;
4.确定证书来源
当两者都验证通过时,表示节点接收到的node.crt是由本地加载的ca.crt签发的。
TLS握手流程
TLS(SSL)建立连接时,需要互换证书验证。