超級(jí)賬本HyperLedger的fabricCA的用法講解

說明

概覽

編譯安裝

fabric-ca-server初始化

生成fabric-ca管理員的憑證

查看聯(lián)盟成員

注冊(cè)新用戶

用戶的屬性

查看用戶詳情

用戶的權(quán)利范圍

參考

說明

超級(jí)賬本HyperLedger視頻教程演示匯總:HyperLedger Fabric的視頻講解–“主頁”中可領(lǐng)優(yōu)惠券

超級(jí)賬本HyperLedger的Fabric-CA的使用演示(兩個(gè)組織一個(gè)Orderer三個(gè)Peer)

Hyperledger Fabric CA是Hyperledger Fabric的證書授權(quán)中心痒谴,支持:

添加用戶俗冻、或者對(duì)接LDAP

簽發(fā)注冊(cè)證書

證書的更新和撤銷

Welcome to Hyperledger Fabric CA

fabric-ca codes

概覽

如下圖所示恩急,fabric-ca可以對(duì)接ldap蝌借,或者mysql、pgsql數(shù)據(jù)庫诬烹。

通過fabric-ca client或者fabric-ca的sdk獲得證書后岛杀,就可以用這些證書訪問Peer搂擦。

編譯安裝

$ go get -u github.com/hyperledger/fabric-ca

$ cd $GOPATH/src/github.com/hyperledger/fabric-ca

$ make fabric-ca-server

$ make fabric-ca-client

$ ls bin/

fabric-ca-client? fabric-ca-server

fabric-ca-server初始化

mkdir -p /opt/app/fabric-ca/client

cp $GOPATH/src/github.com/hyperledger/fabric-ca/bin/fabric-ca-client /opt/app/fabric-ca/client/

ln -s /opt/app/fabric-ca/client/fabric-ca-client? /usr/bin/fabric-ca-client

mkdir -p /opt/app/fabric-ca/server

cp $GOPATH/src/github.com/hyperledger/fabric-ca/bin/fabric-ca-server /opt/app/fabric-ca/server/

cd /opt/app/fabric-ca/server

初始化纱烘,可以使用ldap、mysql祈餐、postgresql擂啥,或者本地sqlite,默認(rèn)sqlite:

./fabric-ca-server init -b admin:pass

如果啟動(dòng)的是中間CA帆阳,用-u指定上級(jí)CA:

./fabric-ca-server start -b admin:adminpw -u http://:@:

如果直接作為RootCA哺壶,后面兩個(gè)參數(shù)表示允許刪除聯(lián)盟和用戶:

./fabric-ca-server start -b admin:pass --cfg.affiliations.allowremove? --cfg.identities.allowremove

初始化后,會(huì)在當(dāng)前目錄生成以下文件:

ca-cert.pem? fabric-ca-server-config.yaml? fabric-ca-server.db? msp/

fabric-ca-server-config.yaml是fabric-ca-server的配置文件舱痘。

其中ca-cert.pem是一個(gè)自簽署的證書:

$ openssl verify -CAfile ca-cert.pem ca-cert.pem

ca-cert.pem: OK

這個(gè)證書是根據(jù)fabric-ca-server-config.yaml中的csr生成的:

csr:

? cn: fabric-ca-server

? names:

? ? ? - C: US

? ? ? ? ST: "North Carolina"

? ? ? ? L:

? ? ? ? O: Hyperledger

? ? ? ? OU: Fabric

? hosts:

? ? - 10-39-0-121

? ? - localhost

? ca:

? ? ? expiry: 131400h

? ? ? pathlength: 1

可以用下面的命令查看:

openssl x509 -in ca-cert.pem? -text

如果要生成被其它CA簽署的證書变骡,使用-u指定上一級(jí)CA:

-u

URL格式:

? ? ://:@:

如果要簽署已經(jīng)準(zhǔn)備好的key,需要用ca.certfile和ca.keyfile指定:

ca:

? # Name of this CA

? name:

? # Key file (is only used to import a private key into BCCSP)

? keyfile:

? # Certificate file (default: ca-cert.pem)

? certfile:

? # Chain file

? chainfile:

msp/keystore中存放的BCCSP (BlockChain Crypto Service Provider)中用到的key:

bccsp:

? ? default: SW

? ? sw:

? ? ? ? hash: SHA2

? ? ? ? security: 256

? ? ? ? filekeystore:

? ? ? ? ? ? # The directory used for the software file-based keystore

? ? ? ? ? ? keystore: msp/keystore

還可以通過指定-cacount生成多個(gè)CA:

fabric-ca-server start -b admin:adminpw --cacount 2

以及指定多個(gè)cafiles:

fabric-ca-server start -b admin:adminpw --cafiles ca/ca1/fabric-ca-config.yaml --cafiles ca/ca2/fabric-ca-config.yaml

每個(gè)cafiles格式如下:

ca:

# Name of this CA

name:

csr:

? cn:

目錄結(jié)構(gòu)可以如下:

--

? |--ca

? ? |--ca1

? ? ? |-- fabric-ca-config.yaml

? ? |--ca2

? ? ? |-- fabric-ca-config.yaml

生成fabric-ca管理員的憑證

生成第一個(gè)用戶的憑證:

export FABRIC_CA_CLIENT_HOME=/opt/app/fabric-ca/clients/admin

mkdir -p $FABRIC_CA_CLIENT_HOME

fabric-ca-client enroll -u http://admin:pass@localhost:7054

或者:

fabric-ca-client enroll -u http://admin:pass@localhost:7054 -H `pwd`

在/opt/app/fabric-ca/clients/admin可以看到生成了以下文件:

fabric-ca-client-config.yaml? msp/

其中fabric-ca-client-config.yaml是一個(gè)默認(rèn)的配置文件,msp/中存放的是相關(guān)的證書芭逝。

msp/

|-- cacerts

|? -- localhost-7054.pem

|-- intermediatecerts

|? -- localhost-7054.pem

|-- keystore

|? -- a17c01f53b037cbf51ad76f2a95684e6b2a4b8371e0b247949805af8035bf50e_sk

-- signcerts

? ? -- cert.pem

之后就可以通過msp目錄中的證書塌碌,訪問fabric-ca,不需要在輸入密碼旬盯。

查看聯(lián)盟成員

fabric-ca默認(rèn)注冊(cè)了幾個(gè)聯(lián)盟台妆,可以用affiliation list查看:

$ fabric-ca-client affiliation list

2018/04/28 14:59:55 [INFO] 127.0.0.1:38094 GET /affiliations 200 0 "OK"

affiliation: .

? affiliation: org1

? ? ? affiliation: org1.department1

? ? ? affiliation: org1.department2

? affiliation: org2

? ? ? affiliation: org2.department1

添加/刪除聯(lián)盟成員,也是通過這個(gè)命令進(jìn)行:

fabric-ca-client affiliation add another

fabric-ca-client affiliation add another.sub

新增加的聯(lián)盟成員如下:

[root@10-39-0-121 admin]# fabric-ca-client affiliation list

2018/04/28 15:03:42 [INFO] 127.0.0.1:38104 GET /affiliations 201 0 "OK"

affiliation: .

? affiliation: org1

? ? ? affiliation: org1.department1

? ? ? affiliation: org1.department2

? affiliation: org2

? ? ? affiliation: org2.department1

? affiliation: another

? ? ? affiliation: another.sub1

默認(rèn)是禁止刪除聯(lián)盟胖翰,如果需要開啟接剩,需要在啟動(dòng)fabric-ca-server時(shí)傳入?yún)?shù)--cfg.affiliations.allowremove:

./fabric-ca-server start -b? admin:pass? --cfg.affiliations.allowremove

然后可以刪除:

fabric-ca-client affiliation remove another.sub1

如果聯(lián)盟下還有聯(lián)盟,可以加上參數(shù)-force級(jí)聯(lián)刪除萨咳。

注冊(cè)新用戶

例如注冊(cè)一個(gè)名為admin2的用戶懊缺,先指定要使用的用戶的client目錄:

$ export FABRIC_CA_CLIENT_HOME=/opt/app/fabric-ca/clients/admin

也可以用-H參數(shù)指定:

$ fabric-ca-client -H /opt/app/fabric-ca/clients/admin? <其它參數(shù)...>

注冊(cè)新用戶的命令如下:

$ fabric-ca-client register --id.name admin2 --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,admin=true:ecert'

2018/04/28 10:20:42 [INFO] Configuration file location: /opt/app/fabric-ca/clients/admin/fabric-ca-client-config.yaml

2018/04/28 10:20:42 [INFO] 127.0.0.1:38036 POST /register 201 0 "OK"

Password: wvkpvMzLsjPz

新用戶注冊(cè)后,會(huì)自動(dòng)為新用戶生成一個(gè)密碼培他,新用戶需要使用這個(gè)密碼鹃两,生成自己的憑證,就像第一個(gè)用戶那樣舀凛。

為新注冊(cè)的用戶admin2準(zhǔn)備一個(gè)目錄俊扳,注意要使用一個(gè)新的目錄,防止與其它用戶混淆:

export FABRIC_CA_CLIENT_HOME=/opt/app/fabric-ca/clients/admin2

mkdir -p $FABRIC_CA_CLIENT_HOME

然后生成憑證:

fabric-ca-client enroll -u http://admin2:wvkpvMzLsjPz@localhost:7054

之后可以看到新的目錄中也生成了fabric-ca-client-config.yaml和msp/猛遍,這是admin2用戶的憑證:

$ tree admin2/

admin2/

|-- fabric-ca-client-config.yaml

-- msp

? ? |-- cacerts

? ? |? -- localhost-7054.pem

? ? |-- intermediatecerts

? ? |? -- localhost-7054.pem

? ? |-- keystore

? ? |? -- 6732d8d3802384c8935aa7174930975ba6141b6d4bc419e6ccbe5f4d76db58f0_sk

? ? -- signcerts

? ? ? ? -- cert.pem

用戶的屬性

在注冊(cè)admin2的時(shí)候馋记,指定了這樣一些屬性--id.attrs 'hf.Revoker=true,admin=true:ecert':

fabric-ca-client register --id.name admin2 --id.affiliation org1.department1 --id.attrs 'hf.Revoker=true,admin=true:ecert'

這些屬性是一定要了解的,以hf.開頭的屬性懊烤,是fabric-ca的內(nèi)置屬性:

hf.Registrar.Roles? ? ? ? ? ? List? ? ? ? List of roles that the registrar is allowed to manage

hf.Registrar.DelegateRoles? ? List? ? ? ? List of roles that the registrar is allowed to give to a registree for its ‘hf.Registrar.Roles’ attribute

hf.Registrar.Attributes? ? ? List? ? ? ? List of attributes that registrar is allowed to register

hf.GenCRL? ? ? ? ? ? ? ? ? ? Boolean? ? Identity is able to generate CRL if attribute value is true

hf.Revoker? ? ? ? ? ? ? ? ? ? Boolean? ? Identity is able to revoke a user and/or certificates if attribute value is true

hf.AffiliationMgr? ? ? ? ? ? Boolean? ? Identity is able to manage affiliations if attribute value is true

hf.IntermediateCA? ? ? ? ? ? Boolean? ? Identity is able to enroll as an intermediate CA if attribute value is true

這些屬性表示的是用戶是否擁有相關(guān)的權(quán)限:

hf.Registrar.Roles該用戶可以增加的新用戶類型梯醒,用戶類型都有:client、orderer奸晴、peer冤馏、user。

hf.Registrar.DelegateRoles該用戶可以設(shè)置的新用戶的hf.Registrar.Roles屬性寄啼。

hf.Registrar.Attributes該用戶可以為新用戶設(shè)置的保留屬性和自定義屬性逮光。

hf.GenCRL該用戶是否可以獲取CRL列表代箭,已經(jīng)撤銷的證書列表。

hf.Revoker該用戶是否能夠撤銷其它用戶涕刚。

hf.AffiliationMgr該用戶是否可以管理聯(lián)盟嗡综。

hf.IntermediateCA該用戶是否可以作為中間CA。

除了這些以hf.開頭的屬性外杜漠,還可以自定義屬性极景,例如下面的admin=true:

fabric-ca-client register --id.name admin2 --id.affiliation org1.department1 \

--id.attrs 'hf.Revoker=true,admin=true:ecert'

用戶自定義的屬性可以寫入到用戶的憑證中,在合約中可以獲取發(fā)起請(qǐng)求的用戶屬性驾茴,根據(jù)用戶屬性決定用戶是否由操作權(quán)限盼樟。

參考HyplerLedger FabricCA ABACHyperLedger Fabric Chaincode ABAC給出一個(gè)使用ABAC的chaincode:

...

"github.com/hyperledger/fabric/core/chaincode/lib/cid"

...

err := cid.AssertAttributeValue(stub, "abac.init", "true")

if err != nil {

? ? return shim.Error(err.Error())

}

...

cid的使用說明見:?HyperLedger Fabric: Client Identity Chaincode Library

cid(Client Identity)中提供下面的方法:

+AssertAttributeValue(stub ChaincodeStubInterface, attrName, attrValue string) : error

+GetAttributeValue(stub ChaincodeStubInterface, attrName string) : string, bool, error

+GetID(stub ChaincodeStubInterface) : string, error

+GetMSPID(stub ChaincodeStubInterface) : string, error

+GetX509Certificate(stub ChaincodeStubInterface) : *x509.Certificate, error

+New(stub ChaincodeStubInterface) : ClientIdentity, error

▼+ClientIdentity : interface

? ? [methods]

? +AssertAttributeValue(attrName, attrValue string) : error

? +GetAttributeValue(attrName string) : string, bool, error

? +GetID() : string, error

? +GetMSPID() : string, error

? +GetX509Certificate() : *x509.Certificate, error

“admin=true:ecert”中的ecert的意思是锈至,該屬性會(huì)被自動(dòng)寫入到用戶憑證中(enrollment certificate)晨缴。

對(duì)于沒有注明ecert的屬性,可以在生成用戶憑證的時(shí)候峡捡,例如注冊(cè)了這樣一個(gè)用戶的時(shí)候:

fabric-ca-client register --id.name user1 --id.secret user1pw --id.type user \

--id.affiliation org1 --id.attrs 'app1Admin=true:ecert,email=user1@gmail.com'

它的屬性email=user1@gmail.com沒有注明是ecert击碗,在生成憑證的時(shí)候,可以指定下面的屬性:

fabric-ca-client enroll -u http://user1:user1pw@localhost:7054 --enrollment.attrs "email,phone:opt"

app1Admin將被自動(dòng)包含在憑證中们拙;email是被明確指定的稍途,它必須是存在的,否則報(bào)錯(cuò)砚婆;phone:opt也是明確指定的械拍,opt表示phone屬性可選的,如果沒有phone屬性不會(huì)報(bào)錯(cuò)装盯。

以hf.開頭的下面三個(gè)屬性殊者,也會(huì)被自動(dòng)包含在登陸憑證中:

hf.EnrollmentID? ? The enrollment ID of the identity

hf.Type? ? ? ? ? ? The type of the identity

hf.Affiliation? ? The affiliation of the identity

查看用戶詳情

可以用fabric-ca-client identity list查看有權(quán)限查看的用戶的詳情:

$ fabric-ca-client identity list

Name: admin, Type: client, Affiliation: , Max Enrollments: -1, Attributes: [{Name:hf.GenCRL Value:1 ECert:false} {Name:hf.Registrar.Attributes Value:* ECert:false} {Name:hf.AffiliationMgr Value:1 ECert:false} {Name:hf.Registrar.Roles Value:peer,orderer,client,user ECert:false} {Name:hf.Registrar.DelegateRoles Value:peer,orderer,client,user ECert:false} {Name:hf.Revoker Value:1 ECert:false} {Name:hf.IntermediateCA Value:1 ECert:false}]

Name: admin2, Type: client, Affiliation: org1.department1, Max Enrollments: -1, Attributes: [{Name:hf.Revoker Value:true ECert:false} {Name:admin Value:true ECert:true} {Name:hf.EnrollmentID Value:admin2 ECert:true} {Name:hf.Type Value:client ECert:true} {Name:hf.Affiliation Value:org1.department1 ECert:true}]

用戶的權(quán)利范圍

用戶的權(quán)利范圍是用聯(lián)盟屬性hf.Affiliation來控制的。

hf.Affiliation? ? The affiliation of the identity

聯(lián)盟屬性一個(gè)類似”a.b.c”樣式的字符串验夯,最頂層用戶的該屬性為”.”。

一個(gè)用戶只能管理平級(jí)以及下級(jí)的用戶摔刁。

例如如果一個(gè)用戶的hf.Affiliation是”a.b.*“挥转,那么它能管理的用戶的聯(lián)盟屬性必須以”a.b”開頭。

聯(lián)盟屬性可以配置多個(gè)共屈,并且支持通配符绑谣,例如:

hf.Registrar.Attributes = a.b.*, x.y.z

另外:

一個(gè)用戶管理它的`hf.Registrar.Roles`屬性中列出用戶類型。

一個(gè)用戶能夠管理的其它用戶的屬性拗引,只能是它的`hf.Registrar.Attributes`屬性列出的屬性借宵。

? ? 其中保留屬性,還要求必須是當(dāng)前用戶擁有的屬性矾削。

后續(xù)的很多操作都受到權(quán)利范圍的約束壤玫。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末豁护,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子欲间,更是在濱河造成了極大的恐慌楚里,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,865評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猎贴,死亡現(xiàn)場(chǎng)離奇詭異班缎,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)她渴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,296評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門达址,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人趁耗,你說我怎么就攤上這事沉唠。” “怎么了对粪?”我有些...
    開封第一講書人閱讀 169,631評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵右冻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我著拭,道長(zhǎng)纱扭,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,199評(píng)論 1 300
  • 正文 為了忘掉前任儡遮,我火速辦了婚禮乳蛾,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鄙币。我一直安慰自己肃叶,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,196評(píng)論 6 398
  • 文/花漫 我一把揭開白布十嘿。 她就那樣靜靜地躺著因惭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪绩衷。 梳的紋絲不亂的頭發(fā)上蹦魔,一...
    開封第一講書人閱讀 52,793評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音咳燕,去河邊找鬼勿决。 笑死,一個(gè)胖子當(dāng)著我的面吹牛招盲,可吹牛的內(nèi)容都是我干的低缩。 我是一名探鬼主播,決...
    沈念sama閱讀 41,221評(píng)論 3 423
  • 文/蒼蘭香墨 我猛地睜開眼曹货,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼咆繁!你這毒婦竟也來了讳推?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,174評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤么介,失蹤者是張志新(化名)和其女友劉穎娜遵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體壤短,經(jīng)...
    沈念sama閱讀 46,699評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡设拟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,770評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了久脯。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片纳胧。...
    茶點(diǎn)故事閱讀 40,918評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖帘撰,靈堂內(nèi)的尸體忽然破棺而出跑慕,到底是詐尸還是另有隱情,我是刑警寧澤摧找,帶...
    沈念sama閱讀 36,573評(píng)論 5 351
  • 正文 年R本政府宣布核行,位于F島的核電站,受9級(jí)特大地震影響蹬耘,放射性物質(zhì)發(fā)生泄漏芝雪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,255評(píng)論 3 336
  • 文/蒙蒙 一综苔、第九天 我趴在偏房一處隱蔽的房頂上張望惩系。 院中可真熱鬧,春花似錦如筛、人聲如沸堡牡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,749評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晤柄。三九已至,卻和暖如春妖胀,著一層夾襖步出監(jiān)牢的瞬間可免,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,862評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工做粤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捉撮。 一個(gè)月前我還...
    沈念sama閱讀 49,364評(píng)論 3 379
  • 正文 我出身青樓怕品,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親巾遭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子肉康,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,926評(píng)論 2 361

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