FISCO-BCOS环境搭建(五)机构证书准入

FISCO BCOS提供了证书准入的功能。在节点加入网络后,节点间是否能够通信,还可通过证书进行控制。在FISCO BCOS中,节点的证书代表了此节点属于某个机构。FISCO BCOS区块链中的管理者,可以通过配置机构的证书,控制相应证书的节点是否能够与其它节点通信。

机构证书的准入依赖系统合约,在进行机构证书准入操作前,再次请确认:

(1)系统合约已经被正确的部署。

(2)所有节点的config.json的systemproxyaddress字段已经配置了相应的系统代理合约地址。

(3)节点在配置了systemproxyaddress字段后,已经重启使得系统合约生效。

(4)/mydata/FISCO-BCOS/systemcontractv2/下的config.js已经正确的配置了节点的RPC端口。

7.1 配置节点证书

节点的证书存放目录在节点文件目录的data文件夹下。包括:

  • ca.crt:根证书公钥,整条区块链共用。
  • ca.key:根证书私钥,私钥应保密,仅在生成节点证书公私钥时使用。
  • server.crt:节点证书的公钥。
  • server.key:节点证书的私钥,私钥应保密。

证书文件应严格按照上述命名方法命名。

FISCO BCOS通过授权某节点对应的公钥server.crt,控制此节点是否能够与其它节点正常通信。

具体配置过程请参考2.4 配置证书 。在配置节点的步骤中已涵盖相关证书的配置方法,若按照步骤部署了节点,则可直接进入下一步骤。

7.2 开启所有节点的SSL验证功能

在进行节点证书授权管理前,需开启区块链上每个节点的SSL验证功能。

此处以创世节点为例,其它节点也应采用相同的操作。

cd /mydata/nodedata-1/
vim config.json

将ssl字段置为1,效果如下。

"ssl":"1",

修改完成后重启节点,使其生效。

./stop.sh
./start.sh

其它节点也采用相同的操作,开启SSL验证功能。

注意:必须所有的节点都开启ssl功能,才能继续下一步骤。

7.3 配置机构证书信息

将节点的证书写入系统合约,为接下来的证书准入做准备。每张证书都应该写入系统合约中。节点的证书若不写入系统合约,相应的节点将不允许通信。

7.3.1 获取证书序列号

获取server.crt的序列号

cd /mydata/nodedata-2/data
openssl x509 -noout -in server.crt -serial

可得到证书序列号

serial=8A4B2CDE94348D22

7.3.2 编写证书准入状态文件

在systemcontractv2目录下编写。

cd /mydata/FISCO-BCOS/systemcontractv2
vim ca.json

将序列号填入hash字段。配置status,0表示不可用,1表示可用。其它字段默认即可。如下,让node2的证书可用。即status置1。

{
        "hash" : "8A4B2CDE94348D22",
        "status" : 1,
        "pubkey":"",
        "orgname":"",
        "notbefore":20170223,
        "notafter":20180223,
        "whitelist":"",
        "blacklist":""
}

证书准入状态文件其它字段说明请参考11.6 证书准入状态文件说明

7.3.3 将证书准入状态写入系统合约

执行以下命令,指定证书准入状态文件ca.json,将证书状态写入系统合约。

babel-node tool.js CAAction update ca.json

7.4 设置证书验证开关

证书验证开关能够控制是否采用证书准入机制。开启后,将根据系统合约里的证书状态(status)控制节点间是否能够通信。不在系统合约中的证书对应的节点,将不允许通信。

在打开此开关前,请确认:

(1)所有的节点都正确的配置了相应机构的证书(即server.key、server.crt)。

(2)所有节点的SSL验证已经打开。(标志位已经设置,设置后节点已经重启)。

(3)所有机构的证书信息都已经配置入系统合约。

上述条件未达到,会出现节点无法连接,节点无法共识,合约操作无法进行的情况。若出现上述情况,请先关闭所有节点的SSL验证功能,做了正确的配置后,再打开SSL功能。

7.4.1 开启全局开关

执行命令,CAVerify设置为true

babel-node tool.js ConfigAction set CAVerify true

查看开关是否生效

babel-node tool.js ConfigAction get CAVerify

输出true,表示开关已打开

CAVerify=true,29

7.4.2 关闭全局开关

开关关闭后,节点间的通信不再验证证书。

执行命令,CAVerify设置为false

babel-node tool.js ConfigAction set CAVerify false

7.5 修改节点证书准入状态

已经写入系统合约的证书状态,允许修改(可用/不可用)

7.5.1 修改证书准入状态文件

修改相应证书对应的证书准入状态文件ca.json

/mydata/FISCO-BCOS/systemcontractv2
vim ca.json

配置status,0表示不可用,1表示可用。其它字段默认即可。如下,让node2的证书不可用。即status置0。

{
        "hash" : "8A4B2CDE94348D22",
        "status" : 0,
        "pubkey":"",
        "orgname":"",
        "notbefore":20170223,
        "notafter":20180223,
        "whitelist":"",
        "blacklist":""
}

证书准入状态文件其它字段说明请参考11.6 证书准入状态文件说明

7.5.2 更新证书准入状态

执行以下命令,指定证书准入状态文件ca.json,更新证书准入状态。

babel-node tool.js CAAction updateStatus ca.json

查看证书状态

babel-node tool.js CAAction all

可看到证书状态

----------CA 0---------
hash=8A4B2CDE94348D22
pubkey=
orgname=
notbefore=20170223
notafter=20180223
status=0
blocknumber=36
whitelist=
blacklist=

7.6 证书常见问题FAQ

Q:证书验证的原理?  
A:假设A节点与B节点连接,相互连接的节点把本地的server.crt文件发送到对方节点,对方节点使用本地的ca.crt文件验证server.crt证书文件有效性,验证成功建立连接否则断连。所以要想成功建立连接确保节点的server.crt由同一ca颁发。

Q.CAAction合约验证的原理?
A:打开CAVerify开关,节点连接时在CAAction合约中查找节点证书是否在合约中,如果存在节点正常连接否则连接失败。打开CAVerify开关时确保CAAction合约中已经写入区块链上所有节点的证书信息,否则未写入合约的节点无法正常连接。

Q:打开ssl节点无法连接
A:1.确保所有节点的data目录下config.json配置文件中的ssl已配置为1。 2.打开CAVerify开关前确保所有节点的证书信息是否已写到CAACtion合约中。

Q:已打开CAVerify开关未写入节点证书信息到CAACtion合约中导致节点无法连接
A:在所有节点的data目录下config.json配置文件中ssl设置为0并重启节点,节点正常连接后把CAVerify设置为false,再重新把所有节点的config.json配置文件中的ssl设置为1。再重新把节点证书写入CAACtion合约中再打开CAVerify开关即可。

Q:证书有效期无法设置
A:生成证书脚本中ca根证书固定为10年,用户证书固定为1年,如有修改证书有效期需求可修改genkey.sh脚本中的日期即可。

Q:java客户端无法与节点通信问题
A:java客户端需使用与节点相同的ca.crt证书。如节点证书自生成则使用以下指令生成java客户端证书:
1、openssl pkcs12 -export -name client -in server.crt -inkey server.key -out keystore.p12
2、keytool -importkeystore -destkeystore client.keystore -srckeystore keystore.p12 -srcstoretype pkcs12 -alias client
3、Attention! Password must be ”123456”

你可能感兴趣的:(BCOS)