Hyperledger Fabric(HF)爲終端用戶使用自有CA提供了fabric-ca工具。然而在生產環境中應當儘量保證根CA的安全性,例如讓根CA離線,而將Hyperledger Fabric環境中的證書籤發代理給中間 CA。在本文中,咱們將介紹如何使用第三方CA做爲根CA,使用fabric-ca做爲中間CA,以及如何在CA信任鏈中整合第三方CA與fabric-ca。git
爲了演示外部CA和中間CA的使用,咱們將部署一個根CA,它只負責簽發中間CA的證書。這個中間CA採用Fabric CA,負責簽發用戶和節點證書。出於簡化考慮,在這個教程中,咱們將使OpenSSL。docker
在開始以前,請參考相應文檔先完成如下前置環節的部署和知識準備:安全
克隆本教程演示代碼倉庫,其中包含了全部用到的腳本:bash
git clone https://github.com/aldredb/external-ca cd external-ca
下載Hyperledger Fabric預編譯程序並刪除不須要的文件。咱們只用到cryptogen, fabric-ca-client和configtx。curl
curl -sSL http://bit.ly/2ysbOFE | bash -s -- 1.4.1 -d -s rm -f config/configtx.yaml config/core.yaml config/orderer.yaml
使用cryptogen爲排序節點機構生成證書和密鑰:工具
export PATH=$PWD/bin:$PATH export FABRIC_CFG_PATH=${PWD} cryptogen generate --config=./crypto-config.yaml
建立用於保存對等節點機構org1.example.com
的證書和密鑰的目錄結構。以下所示,該機構包含一個節點peer0.org1.example.com
和兩個用戶:admin
和Admin@org1.example.com
。中間CA的證書和密鑰將保存在ca文件夾裏。區塊鏈
ORG_DIR=$PWD/crypto-config/peerOrganizations/org1.example.com PEER_DIR=$ORG_DIR/peers/peer0.org1.example.com REGISTRAR_DIR=$ORG_DIR/users/admin ADMIN_DIR=$ORG_DIR/users/Admin@org1.example.com mkdir -p $ORG_DIR/ca $ORG_DIR/msp $PEER_DIR $REGISTRAR_DIR $ADMIN_DIR
生成私鑰和證書籤名請求/CSR。注意機構的值與根CA相同。url
openssl ecparam -name prime256v1 -genkey -noout -out \ $ORG_DIR/ca/ica.org1.example.com.key.pem openssl req -new -sha256 -key $ORG_DIR/ca/ica.org1.example.com.key.pem \ -out $ORG_DIR/ca/ica.org1.example.com.csr \ -subj "/C=SG/ST=Singapore/L=Singapore/O=org1.example.com/OU=/CN=ica.org1.example.com"
根CA負責簽名中間CA的CSR並簽發證書,中間CA證書的有效期是根CA證書的一半。注意咱們使用v3_intermediate_ca擴展。代理
openssl ca -batch -config openssl_root.cnf -extensions v3_intermediate_ca \ -days 1825 -notext -md sha256 -in $ORG_DIR/ca/ica.org1.example.com.csr \ -out $ORG_DIR/ca/ica.org1.example.com.crt.pem
如今讓咱們看一下獲得的證書:
openssl x509 -in $ORG_DIR/ca/ica.org1.example.com.crt.pem -text -noout
以下所示,能夠看到證書的簽發機構是: rca.org1.example.com:
Issuer: C=SG, ST=Singapore, L=Singapore, O=org1.example.com, CN=rca.org1.example.com Validity Not Before: May 3 10:16:44 2019 GMT Not After : Apr 30 10:16:44 2029 GMT Subject: C=SG, ST=Singapore, O=org1.example.com, CN=ica.org1.example.com
一旦咱們簽發了中間CA的證書,就再也不須要根CA了,除非須要建立另外一箇中間CA或者回收中間CA的證書。
如今建立CA鏈文件,其中包含了中間CA和genCA的證書:
cat $ORG_DIR/ca/ica.org1.example.com.crt.pem \ $PWD/rca/certs/rca.org1.example.com.crt.pem > \ $ORG_DIR/ca/chain.org1.example.com.crt.pem
最後啓動中間CA,中間CA的配置文件指向咱們前面建立的證書、密鑰和CA鏈。 你能夠參考ca-config/fabric-ca-server-config.yaml文件:
docker-compose up -d ica.org1.example.com
中間CA就緒後,咱們如今能夠簽發用戶證書和peer節點證書了。
首先加入(enroll)admin用戶,該用戶有權限註冊(register)其餘用戶:
export FABRIC_CA_CLIENT_HOME=$REGISTRAR_DIR fabric-ca-client enroll --csr.names C=SG,ST=Singapore,L=Singapore,O=org1.example.com \ -m admin -u http://admin:adminpw@localhost:7054
如今用admin註冊機構org1.example.com
的管理員Admin@org1.example.com
,以及peer節點peer0.org1.example.com
:
fabric-ca-client register --id.name Admin@org1.example.com \ --id.secret mysecret --id.type client --id.affiliation org1 \ -u http://localhost:7054fabric-ca-client register \ --id.name peer0.org1.example.com --id.secret mysecret \ --id.type peer --id.affiliation org1 -u http://localhost:7054
加入Admin@org1.example.com
:
export FABRIC_CA_CLIENT_HOME=$ADMIN_DIR fabric-ca-client enroll \ --csr.names C=SG,ST=Singapore,L=Singapore,O=org1.example.com \ -m Admin@org1.example.com \ -u http://Admin@org1.example.com:mysecret@localhost:7054 mkdir -p $ADMIN_DIR/msp/admincerts && \ cp $ADMIN_DIR/msp/signcerts/*.pem $ADMIN_DIR/msp/admincerts/
加入peer0.org1.example.com
:
export FABRIC_CA_CLIENT_HOME=$PEER_DIRfabric-ca-client enroll \ --csr.names C=SG,ST=Singapore,L=Singapore,O=org1.example.com \ -m peer0.org1.example.com \ -u http://peer0.org1.example.com:mysecret@localhost:7054 mkdir -p $PEER_DIR/msp/admincerts && \ cp $ADMIN_DIR/msp/signcerts/*.pem $PEER_DIR/msp/admincerts/
如今讓咱們看一下其中某個證書,例如peer0.org1.example.com
的證書:
openssl x509 -in $PEER_DIR/msp/signcerts/cert.pem -text -noout
證書的簽發者應當是ica.org1.example.com
:
Issuer: C=SG, ST=Singapore, O=org1.example.com, CN=ica.org1.example.com Validity Not Before: May 3 10:27:59 2019 GMT Not After : May 2 10:28:00 2020 GMT Subject: C=SG, ST=Singapore, L=Singapore, O=org1.example.com, OU=peer, OU=org1, CN=peer0.org1.example.com
恭喜!咱們已經完成了第三方CA和Fabric CA的整合!