說明
說明
超級(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可以對(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 ABAC,HyperLedger 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)利范圍的約束壤玫。