1. 程式人生 > >FISCO-BCOS環境搭建(五)機構證書准入

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”