Hyperledger Fabric-ca調(diào)試

本文主要記錄自己對Hyperledger fabric-ca的操作及認(rèn)識,為原創(chuàng)內(nèi)容评姨,如有文中有書寫或其他問題甥雕,請留言指導(dǎo)修正踩身,互相交流,共同進步犀农,本人QQ:417213902惰赋。

1、簡單聊聊Fabric-ca模塊

  • Fabric-ca模塊其實是個證書頒發(fā)模塊呵哨,僅有證書頒發(fā)功能赁濒,也就是說在做交易或者在鏈中做其他操作時,是不涉及ca模塊孟害,這里我最初不是這么認(rèn)為的拒炎,我覺得應(yīng)該是它頒發(fā)證書后,后面在鏈中每一次操作挨务,ca模塊都進行相應(yīng)的配合驗證校驗功能击你,這對目前的fabric-ca模塊是個誤區(qū)玉组。
  • 當(dāng)然你也可以不用ca模塊來管理證書,證書可以通過專門的證書部門生成根證書丁侄,然后在本地通過cryptogen工具自行生成證書(這個方式在上一篇文章中已經(jīng)講過)惯雳。
  • fabric-ca分為fabric-ca-client和fabric-ca-server,fabric-ca-server就是ca服務(wù);fabric-ca-server是可以通過fabric-ca-client 來操作生成證書鸿摇、登記石景、注冊、撤銷證書等操作拙吉。
  • 以下思路是通過作者自己不斷的摸索得出的結(jié)論潮孽,不保證生產(chǎn)環(huán)境是否適用。

2筷黔、通過client端生成證書管理

2.1往史、前期準(zhǔn)備

  • 修改docker-compose.yaml文件
    直接修改這個路徑下的$GOPATH/src/github.com/hyperledger/fabric-sdk-java/src/test/fixture/sdkintegration/docker-compose.yaml文件
    直接貼腳本了,修改過的地方標(biāo)注中文說明佛舱,主要是修改了兩個ca的掛載目錄椎例,可以方便操作sqlite3數(shù)據(jù)庫
#
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
#
version: '2'

services:
  ca0:
    image: hyperledger/fabric-ca${IMAGE_TAG_FABRIC_CA}
    environment:
      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
    ports:
      - "7054:7054"
    command: sh -c 'fabric-ca-server start -n ca0 ${V11_IDENTITIES_ALLOWREMOVE} ${V11_AFFILIATIONS_ALLOWREMOVE} --registry.maxenrollments -1 --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/e89b5807c72b15040d7ecdade99eb633995d2339e9b1faa672838a91278974ae_sk -b admin:adminpw ${ORG_HYPERLEDGER_FABRIC_SDKTEST_INTEGRATIONTESTS_CA_TLS} --tls.certfile /etc/hyperledger/fabric-ca-server-config/ca.org1.example.com-cert.pem --tls.keyfile /etc/hyperledger/fabric-ca-server-config/e89b5807c72b15040d7ecdade99eb633995d2339e9b1faa672838a91278974ae_sk -d'

    volumes:
      - ./e2e-2Orgs/${FAB_CONFIG_GEN_VERS}/crypto-config/peerOrganizations/org1.example.com/ca/:/etc/hyperledger/fabric-ca-server-config:ro
#為的是可以訪問fabric-ca-server中生成的文件
      - /etc/hyperledger/fabric-ca-peerOrg1-server:/etc/hyperledger/fabric-ca-server
    container_name: ca_peerOrg1

  ca1:
    image: hyperledger/fabric-ca${IMAGE_TAG_FABRIC_CA}
    environment:
      - FABRIC_CA_HOME=/etc/hyperledger/fabric-ca-server
    ports:
      - "8054:7054"
    command: sh -c 'fabric-ca-server start --registry.maxenrollments -1 --ca.certfile /etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem --ca.keyfile /etc/hyperledger/fabric-ca-server-config/7ba11256a588037957071ad894de23902bd42908b1b183bb03387ae09c133b44_sk -b admin:adminpw ${ORG_HYPERLEDGER_FABRIC_SDKTEST_INTEGRATIONTESTS_CA_TLS} --tls.certfile /etc/hyperledger/fabric-ca-server-config/ca.org2.example.com-cert.pem --tls.keyfile /etc/hyperledger/fabric-ca-server-config/7ba11256a588037957071ad894de23902bd42908b1b183bb03387ae09c133b44_sk -d'
    volumes:
      - ./e2e-2Orgs/${FAB_CONFIG_GEN_VERS}/crypto-config/peerOrganizations/org2.example.com/ca/:/etc/hyperledger/fabric-ca-server-config:ro
#為的是可以訪問fabric-ca-server中生成的文件
      - /etc/hyperledger/fabric-ca-peerOrg2-server:/etc/hyperledger/fabric-ca-server

    container_name: ca_peerOrg2


  orderer.example.com:
    container_name: orderer.example.com
    image: hyperledger/fabric-orderer${IMAGE_TAG_FABRIC}
    environment:
      - ORDERER_GENERAL_LOGLEVEL=debug
      - ORDERER_GENERAL_LISTENADDRESS=0.0.0.0
      - ORDERER_GENERAL_GENESISMETHOD=file
      - ORDERER_GENERAL_GENESISFILE=/etc/hyperledger/configtx/orderer.block
      - ORDERER_GENERAL_LOCALMSPID=OrdererMSP
      - ORDERER_GENERAL_LOCALMSPDIR=/etc/hyperledger/msp/orderer/msp
      - ORDERER_GENERAL_TLS_ENABLED=${ORG_HYPERLEDGER_FABRIC_SDKTEST_INTEGRATIONTESTS_TLS}
      - ORDERER_GENERAL_TLS_PRIVATEKEY=/etc/hyperledger/msp/orderer/tls/server.key
      - ORDERER_GENERAL_TLS_CERTIFICATE=/etc/hyperledger/msp/orderer/tls/server.crt
      - ORDERER_GENERAL_TLS_ROOTCAS=[/etc/hyperledger/msp/orderer/tls/ca.crt]
      - GRPC_TRACE=all=true,
      - GRPC_VERBOSITY=debug
      - ORDERER_GENERAL_AUTHENTICATION_TIMEWINDOW=3600s #Not for production -- remove.
    working_dir: /opt/gopath/src/github.com/hyperledger/fabric
    command: orderer
    volumes:
     - ./e2e-2Orgs/${FAB_CONFIG_GEN_VERS}:/etc/hyperledger/configtx:ro
     - ./e2e-2Orgs/${FAB_CONFIG_GEN_VERS}/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/:/etc/hyperledger/msp/orderer:ro
    ports:
      - 7050:7050

  peer0.org1.example.com:
    container_name: peer0.org1.example.com
    extends:
      file: peer-base/peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer0.org1.example.com
      - CORE_PEER_ADDRESS=peer0.org1.example.com:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org1.example.com:7051
#      - CORE_PEER_GOSSIP_ORGLEADER=true
      - CORE_PEER_LOCALMSPID=Org1MSP
    volumes:
      - /var/run/:/host/var/run/
      - ./e2e-2Orgs/${FAB_CONFIG_GEN_VERS}/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/:/etc/hyperledger/msp/peer:ro
    ports:
      - 7051:7051
      - 7053:7053
    depends_on:
      - orderer.example.com

  peer1.org1.example.com:
    container_name: peer1.org1.example.com
    extends:
      file: peer-base/peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer1.org1.example.com
      - CORE_PEER_ADDRESS=peer1.org1.example.com:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org1.example.com:7051
#      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org1.example.com:7051
      - CORE_PEER_LOCALMSPID=Org1MSP
    volumes:
         - /var/run/:/host/var/run/
         - ./e2e-2Orgs/${FAB_CONFIG_GEN_VERS}/crypto-config/peerOrganizations/org1.example.com/peers/peer1.org1.example.com/:/etc/hyperledger/msp/peer:ro
    ports:
       - 7056:7051
       - 7058:7053
    depends_on:
       - orderer.example.com
       - peer0.org1.example.com

  peer0.org2.example.com:
    container_name: peer0.org2.example.com
    extends:
      file: peer-base/peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer0.org2.example.com
      - CORE_PEER_ADDRESS=peer0.org2.example.com:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer0.org2.example.com:8051
#      - CORE_PEER_GOSSIP_ORGLEADER=true
      - CORE_PEER_LOCALMSPID=Org2MSP
    volumes:
      - /var/run/:/host/var/run/
      - ./e2e-2Orgs/${FAB_CONFIG_GEN_VERS}/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/:/etc/hyperledger/msp/peer:ro
    ports:
      - 8051:7051
      - 8053:7053
    depends_on:
      - orderer.example.com

  peer1.org2.example.com:
    container_name: peer1.org2.example.com
    extends:
      file: peer-base/peer-base.yaml
      service: peer-base
    environment:
      - CORE_PEER_ID=peer1.org2.example.com
      - CORE_PEER_ADDRESS=peer1.org2.example.com:7051
      - CORE_PEER_GOSSIP_EXTERNALENDPOINT=peer1.org2.example.com:8051
#      - CORE_PEER_GOSSIP_BOOTSTRAP=peer0.org2.example.com:8051
      - CORE_PEER_LOCALMSPID=Org2MSP
    volumes:
         - /var/run/:/host/var/run/
         - ./e2e-2Orgs/${FAB_CONFIG_GEN_VERS}/crypto-config/peerOrganizations/org2.example.com/peers/peer1.org2.example.com/:/etc/hyperledger/msp/peer:ro
    ports:
       - 8056:7051
       - 8058:7053
    depends_on:
       - orderer.example.com
       - peer0.org2.example.com

  configtxlator:
      image: hyperledger/fabric-tools${IMAGE_TAG_FABRIC}
      ports:
        - "7059:7059"
      command: /usr/local/bin/configtxlator start
      container_name: configtxlator

  ccenv:
    image: hyperledger/fabric-ccenv${IMAGE_TAG_FABRIC}

  • 后面的所有操作是保證按照上一篇文章操作過來的。

2.2名眉、采用非docker方式啟動ca服務(wù)

此步驟會生成對應(yīng)的文件

  • fabric-ca-server-config.yaml
    當(dāng)前ca節(jié)點的相關(guān)配置
  • fabric-ca-server.db
    當(dāng)前ca節(jié)點的sqlite的數(shù)據(jù)庫
  • msp
    admin管理員的證書私鑰
初始化ca服務(wù)粟矿,-n指定ca名稱,-b指定啟動的管理員用戶名和密碼损拢,
#  fabric-ca-server init -n ca0  -b admin:adminpw
啟動,start會檢查 上述文件是否已經(jīng)生成撒犀,若沒有會重新生成
#  fabric-ca-server start -n ca0  -b admin:adminpw  -d
通過fabric-ca-server init會生成以下目錄結(jié)構(gòu)
.
|-- ca-cert.pem         CA證書文件福压,自簽名 對這個文件做base64編碼處理生成CAChain,如果再對生成后的CAChain做base64編碼處理就會生成對應(yīng)的CA證書內(nèi)容或舞,即ca-cert.pem文件
|-- fabric-ca-server-config.yaml    默認(rèn)配置文件
|-- fabric-ca-server.db     存放數(shù)據(jù)的sqlite數(shù)據(jù)庫
`-- msp
    `-- keystore    存放個人身份的私鑰文件(_sk文件)荆姆,對應(yīng)簽名證書
        `-- 3c163f464eef86178a729eb5b5c0d438c17de16f83f5db14b3cdf2ebe8260b6c_sk

后面的fabric-ca-client步驟統(tǒng)一放在docker方式里,因為操作是一樣的

2.3映凳、采用docker方式啟動ca服務(wù)

按照上面的步驟替換或者修改docker-compose.yaml文件胆筒,完成后啟動容器

#  cd $GOPATH/src/github.com/hyperledger/fabric-sdk-java/src/test/fixture/sdkintegration
   當(dāng)然此處也可只啟動ca容器
#  sh fabric.sh up
 可以看到兩個文件夾fabric-ca-peerOrg1-server和fabric-ca-peerOrg2-server,他們分別是兩個ca容器執(zhí)行fabric-ca-server start后生成的文件诈豌,里面存放了admin用戶的證書及當(dāng)前ca的sqlite數(shù)據(jù)庫
#  cd /etc/hyperledger
設(shè)置環(huán)境變量仆救,客戶端證書存放路徑
#  export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
登記管理員,將本地配置信息矫渔、生成的私鑰和證書請求結(jié)構(gòu)等發(fā)送到服務(wù)器彤蔽,生成證書,然后會存儲到fabric-ca-server.db中庙洼,并返回到client端顿痪,在本地以文件形式保存下來
#  fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
# cd  $FABRIC_CA_CLIENT_HOME
可以看到在客戶端生成的證書镊辕,tree命令自行安裝 yum install tree
#  tree
接著我們看下sqlite3數(shù)據(jù)庫中的數(shù)據(jù)
#  cd /etc/hyperledger/fabric-ca-peerOrg1-server
查看數(shù)據(jù)庫
#  sqlite3 fabric-ca-server.db 
展示所有的表
#  .tables
這時可以看到有一條admin的數(shù)據(jù)
#  select * from users;
這里可以查詢到admin的證書
#  select * from certificates;
執(zhí)行fabric-ca-client enroll后生成的目錄結(jié)構(gòu)文件,首先利用本地配置信息(主要是csr字段下的信息)蚁袭、生成的私鑰和證書請求結(jié)構(gòu)征懈,構(gòu)建EnrollmentRequestNet結(jié)構(gòu),之后通過Restful接口或enroll發(fā)送給服務(wù)端揩悄;服務(wù)器返回消息包括EnrollmentResponse結(jié)構(gòu)信息卖哎,解析出相關(guān)的文件內(nèi)容,并保存到本地虏束。
.
|-- admin
|   |-- cacerts    存放服務(wù)器的證書
|   |   `-- localhost-7054.pem
|   |-- intermediatecerts     
|   |   `-- localhost-7054.pem
|   |-- keystore    客戶端簽名證書的私鑰證書
|   |   `-- d5f8b9f98860a85d7970978526252ffcceaae23e2a7a1ce8c4c09a9496219a67_sk
|   `-- signcerts    服務(wù)端簽發(fā)的代表客戶端身份的證書
|       `-- cert.pem
`-- fabric-ca-client-config.yaml

sqlite3 表解讀

  • users:當(dāng)用戶fabric-ca-clientregister或者管理員fabric-ca-server init時才會生成對應(yīng)的用戶注冊數(shù)據(jù)
  • certificates:用戶表對用的證書
  • affiliations:組織結(jié)構(gòu)
  • properties:配置表
    下面我們再生成一個其他用戶棉饶,以test為例
注冊新用戶前,必須先執(zhí)行登記(可以理解為登錄)管理員镇匀,才能執(zhí)行新用戶注冊照藻,name可以修改,此時會返回一個密碼汗侵,用于后面登錄
#  fabric-ca-client register --id.name name --id.type user --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,foo=bar'   
去數(shù)據(jù)庫中查詢users表和certificates表幸缕,結(jié)果是在users表中新增了一條test數(shù)據(jù),而certificates表并沒有新增數(shù)據(jù)晰韵,說明 fabric-ca-client register只是新增注冊用戶发乔。
#  select * from users;
登記用戶,并生成相應(yīng)的證書,替換上面返回的密碼
#  fabric-ca-client enroll -u http://name:TVCRFuAKIZvo@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/msp
#  cd $FABRIC_CA_CLIENT_HOME/
可以看到新生成的證書
#  tree
去數(shù)據(jù)庫中查詢certificates表雪猪,發(fā)現(xiàn)生成一條新的證書
#  select * from certificates;

以上就是通過fabric-ca-client端生成證書的基本過程栏尚,注意在生產(chǎn)環(huán)境中因為可能會出現(xiàn)多個組織和多個用戶,對個每個組織和用戶都有其自己的證書只恨,所以證書管理是個比較大的工作量译仗,所以建議證書目錄可以采用cryptogen generate 生成的crypto-config這個目錄為準(zhǔn),還是比較清晰的官觅。

這是一個用戶的一套完整的證書
User1@org1.example.com
        |-- msp
        |   |-- admincerts      當(dāng)前節(jié)點用戶證書
        |   |   `-- User1@org1.example.com-cert.pem
        |   |-- cacerts         組織的根節(jié)點證書
        |   |   `-- ca.org1.example.com-cert.pem
        |   |-- keystore        當(dāng)前節(jié)點用戶的私鑰
        |   |   `-- 6f6a67f77af274c92a615521923b8d833105f2a1906870b6ce2acfe4ed06e15b_sk
        |   |-- signcerts
        |   |   `-- User1@org1.example.com-cert.pem
        |   `-- tlscacerts
        |       `-- tlsca.org1.example.com-cert.pem
        `-- tls
            |-- ca.crt
            |-- client.crt
            `-- client.key

3纵菌、通過Java-sdk端生成證書管理

首先,先保證上一篇文章搭建能正常跑通休涤,接下來的內(nèi)容主要是根據(jù)官方提供的demo(即上一篇java版的demo)咱圆,進行源碼解讀。

找到End2endIT這個類中的setup方法功氨,主要是兩個方法

  • enrollUsersSetup : 主要完成對ca的登記及證書的獲取
  • runFabricTest : 鏈碼序苏、通道、peer節(jié)點初始化等操作

這里我們主要講 enrollUsersSetup 疑故,以下這幾步在HFCAClient中的enroll方法中

(1) 生成一對keypair(公鑰和私鑰秘鑰對)


image.png

(2) 用秘鑰對中的公鑰對用戶名進行加密杠览,生成一串密文


image.png

(3) 將密文發(fā)送登記(enroll)到ca服務(wù)端,返回證書鏈


image.png

(4) 對證書鏈做base64處理獲得證書纵势,此時的證書與服務(wù)器里certificates表中的證書一致


image.png

SampleOrg實體中有admin和peerOrgAdmin,比較容易混淆
admin:admin是client端的管理員踱阿,可以理解為組織中的超級管理員;
peerOrgAdmin:是節(jié)點管理員

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末管钳,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子软舌,更是在濱河造成了極大的恐慌才漆,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件佛点,死亡現(xiàn)場離奇詭異醇滥,居然都是意外死亡,警方通過查閱死者的電腦和手機超营,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進店門鸳玩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人演闭,你說我怎么就攤上這事不跟。” “怎么了米碰?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵窝革,是天一觀的道長。 經(jīng)常有香客問我吕座,道長虐译,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任吴趴,我火速辦了婚禮漆诽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘锣枝。我一直安慰自己拴泌,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布惊橱。 她就那樣靜靜地躺著,像睡著了一般箭昵。 火紅的嫁衣襯著肌膚如雪税朴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天家制,我揣著相機與錄音正林,去河邊找鬼。 笑死颤殴,一個胖子當(dāng)著我的面吹牛觅廓,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涵但,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼杈绸,長吁一口氣:“原來是場噩夢啊……” “哼帖蔓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起瞳脓,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤塑娇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后劫侧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埋酬,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年烧栋,在試婚紗的時候發(fā)現(xiàn)自己被綠了写妥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡审姓,死狀恐怖珍特,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邑跪,我是刑警寧澤次坡,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站画畅,受9級特大地震影響砸琅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜轴踱,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一症脂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧淫僻,春花似錦诱篷、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至悯辙,卻和暖如春琳省,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背躲撰。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工针贬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拢蛋。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓桦他,卻偏偏與公主長得像,于是被迫代替她去往敵國和親谆棱。 傳聞我的和親對象是個殘疾皇子快压,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內(nèi)容