Fabric--CA 应用与配置
Fabric CA 應用與配置
簡介
Fabric CA項目是超級賬本Fabric內的MemberService組件, 對網絡內各個實體的身份證書的管理, 主要實現:
- 負責Fabric網絡內所有實體(Identity)的身份管理, 包括身份的注冊、注銷等
- 負責證書管理, 包括ECerts(身份證書)、TCerts(交易證書)等的發放和注銷
- 服務端支持基于客戶端命令行的RESTful API的交互方式
Fabric CA采用Go語言進行編寫
基本組件
Fabric CA采用了典型的C/S架構, 目前包含兩個基本組件, 分別實現服務端功能和客戶端功能
- 服務端: fabric-ca-server實現核心的PKI(Public Key Infrastructure: 公鑰基礎設施)服務功能, 支持多種數據庫后臺(包括SQlite3、MySQL、PostgreSQL等), 并支持集成LDAP用為用戶注冊管理功能
- 客戶端: fabric-ca-client封裝了服務端的RESTful API, 提供訪問服務端的命令, 供用戶與服務端進行交互
安裝服務端與客戶端
安裝Go1.9+
設置GOPATH環境變量
安裝libtool 與 libltdl-dev 依賴包
$ sudo apt update $ sudo apt install libtool libltdl-dev安裝
安裝服務端與客戶端二進制命令到$GOPATH/bin目錄下
$ go get -u github.com/hyperledger/fabric-ca/cmd/...切換至源碼目錄下:
$ cd $GOPATH/src/github.com/hyperledger/fabric-ca/使用make命令編譯:
$ make fabric-ca-server $ make fabric-ca-client生成 bin 目錄, 目錄中包含 fabric-ca-client 與 fabric-ca-server 兩個可執行文件
設置環境變量
$ export PATH=$GOPATH/src/github.com/hyperledger/fabric-ca/bin:$PATH初始化
返回至用戶目錄
$ cd ~ $ mkdir fabric-ca $ cd fabric-cafabric-ca啟動:
1. 使用init進行初始化 2. 使用start啟動初始化
$ fabric-ca-server init -b admin:pass生成配置文件到至當前目錄
- fabric-ca-server-config.yaml: 默認配置文件
- ca-cert.pem: PEM格式的CA證書文件, 自簽名
- fabric-ca-server.db: 存放數據的sqlite數據庫
- msp/keystore/: 路徑下存放個人身份的私鑰文件(_sk文件), 對應簽名證書
快速啟動
快速啟動并初始化一個fabric-ca-server服務
$ fabric-ca-server start -b admin:pass-b: 提供注冊用戶的名稱與密碼, 如果沒有使用LDAP, 這個選項為必需. 默認的配置文件的名稱為fabric-ca-server-config.yaml
如果之前沒有執行初始化命令, 則啟動過程中會自動先進行初始化操作. 即從主配置目錄搜索相關證書和配置文件, 如果不存在則會自動生成
RESTful API
在打開的新終端中輸入以下命令獲取指定CA服務的基本信息.
$ curl -X POST -d '{"caname":"test_ca"}' http://localhost:7054/api/v1/cainfo如要獲取默認CA服務的基本信息, 可以不帶任何參數, 如:
$ curl -X POST http://localhost:7054/api/v1/cainfo服務端命令剖析
fabric-ca-server命令主要負責啟動一個CA服務, 包括init和start兩個子命令
服務端配置文件解析
fabric-ca-server-config.yaml配置文件包括通用配置, TLS配置, CA配置, 注冊管理配置, 數據庫配置, LDAP配置, 組織結構配置, 簽名, 證書申請等幾部分
version: 1.1.1-snapshot-e656889 port: 7054 # 指定服務的監聽端口 debug: false # 是否啟用DEBUG模式, 輸出更多的調試信息上 crlsizelimit: 512000# 是否在服務端啟用TLS,如果啟用TLS后進行身份驗證的證書和簽名的私鑰 tls: enabled: false # 是否啟用TLS, 默認不啟用certfile: # TLS證書文件keyfile: # TLS密鑰文件clientauth: # 客戶端驗證配置type: noclientcert # 默認不進行身份驗證certfiles: # 進行客戶端身份驗證時, 信任的證書文件列表# 包括實例的名稱、簽名私鑰文件、身份驗證證書和證書鏈文件乖;這些私鑰和證書文件會用來作為生成ECert、TCert的根證書 ca: name: # CA服務名稱. 可以支持多個服務keyfile: # 密鑰文件(默認: ca-key.pem)certfile: # 證書文件(默認: ca-cert.pem)chainfile: # 證書鏈文件(默認: chain-cert.pem)crl:expiry: 24h# 當fabric-ca-server自身提供用戶的注冊管理時使用, 此情況下需要禁用LDAP功能, 否則fabric-ca-server將會把注冊管理數據轉發到LDAP進行查詢 registry:# 允許同一個用戶名和密碼進行enrollment的最大次數, -1為無限制, 0為不支持登記maxenrollments: -1 identities: # 注冊的實體信息, 可以進行enroll. 只有當LDAP未啟用時起作用- name: adminpass: adminpwtype: clientaffiliation: ""attrs:hf.Registrar.Roles: "peer,orderer,client,user"hf.Registrar.DelegateRoles: "peer,orderer,client,user"hf.Revoker: truehf.IntermediateCA: true # 該id是否是一個中間層的CAhf.GenCRL: truehf.Registrar.Attributes: "*"hf.AffiliationMgr: true# 數據庫支持SQLite3、MySQL、Postgres. 默認為SQLite3類型的本地數據庫. 如果要配置集群, 則需要選用MySQL或Postgres后端數據庫, 并在前端部署負載均衡器(如Nginx或HAProxy) db:type: sqlite3datasource: fabric-ca-server.db # SQLite3文件路徑tls:enabled: false # 是否啟用TLS來連接到數據庫certfiles: # PEM格式的數據庫服務器的TLS根證書, 可以指定多個, 用逗號隔開client:certfile: # PEM格式的客戶端證書文件keyfile: # PEM格式的客戶端證書私鑰文件# 配置使用遠端的LDAP來進行注冊管理, 認證enrollment的用戶和密碼, 并獲取用戶屬性信息. 此時, 服務端將按照指定的usrfilter從LDAP獲取對應的用戶, 利用其唯一識別名(distinguidhed name)和給定的密碼進行驗證. # 當LDAP功能啟用時, registry中的配置將被忽略 ldap:enabled: false # 是否啟用LDAP, 默認不啟用url: ldap://<adminDN>:<adminPassword>@<host>:<port>/<base> # LDAP的服務地址tls:certfiles: # PEM格式的LDAP服務器的TLS根證書, 可以為多個, 用逗號隔開client:certfile: # PEM格式的客戶端證書文件keyfile: # PEM格式的客戶端證書私鑰文件attribute: names: ['uid','member'] converters:- name:value: maps:groups:- name:value:# 組織結構配置 affiliations:org1:- department1- department2org2:- department1# 簽發證書相關的配置包括簽名方法、證書超時時間等. fabric-ca-server可以作為用戶證書的簽發CA(默認情況下), 也可以作為根CA來進一步支持其它中間CA signing:default: # 默認情況下,用于簽署Ecertusage: # 所簽發證書的KeyUsage extension域- digital signatureexpiry: 8760hprofiles: # 不同的簽發配置ca: # 簽署中間層CA證書時的配置模板usage:- cert sign # 所簽發證書的KeyUsage extension域- crl signexpiry: 43800hcaconstraint:isca: truemaxpathlen: 0 # 限制該中間層CA無法進一步簽署中間層CAtls:usage:- signing- key encipherment- server auth- client auth- key agreementexpiry: 8760h# CA自身證書的申請請求配置. 當CA作為根證書服務時, 將基于請求生成一個自簽名的證書; 當CA作為中間證書服務時, 將請求發送給上層的根證書進行簽署 csr:cn: fabric-ca-server # 建議與服務器名一致names:- C: USST: "North Carolina"L:O: HyperledgerOU: Fabrichosts:- kevin-hf- localhostca: # 配置后會加入到證書的擴展字段expiry: 131400h # 超時時間pathlength: 1 # 允許產生的中間證書的深度# 配置所選擇的加密庫 bccsp:default: SWsw:hash: SHA2security: 256filekeystore:keystore: msp/keystore # 存放密鑰文件的路徑# 自動創建除了默認CA外的多個CA實例, 如ca1、ca2等 cacount:# 可以指定多個CA配置文件路徑, 每個配置文件會啟動一個CA服務,注意不同配置文件之間需要避免出現沖突(如服務端口、TLS證書等) cafiles:# 當CA作為中間層CA服務時的相關配置. 包括父CA的地址和名稱、登記信息、TLS配置等. # 注意: 當intermediate.parentserver.url非空時, 意味著本CA是中間層CA服務,否則為根CA服務 intermediate:parentserver: # 父CA相關信息url:caname:enrollment: # 在父CA側的登記信息hosts: # 證書主機名列表profile: # 簽發所用的profilelabel: # HSM操作中的標簽信息tls: # TLS相關配置certfiles: # 信任的根CA證書client: # 客戶端驗證啟用時的相關文件certfile:keyfile:與服務器端進行交互
可以采用包括RESTful API在內的多種方式與Fabric-CA服務端進行交互. 其中最方便的方式是通過客戶端工具 fabric-ca-client
登記用戶
注冊管理員需要以管理員身份使用CA Client連接到CA Server,并生成相應的文件
$ export PATH=$GOPATH/src/github.com/hyperledger/fabric-ca/bin:$PATH $ fabric-ca-client enroll -u http://admin:pass@localhost:7054如果生成的配置文件不是在當前目錄下, 則運行登記命令后可能會產生如下錯誤
Error: Response from server: Error Code: 20 - Authorization failure 解決方式: 返回至目錄下重新啟動服務 $ cd ~ $ fabric-ca-server start -b admin:pass-u: 進行連接的fabric-ca-server服務地址, 默認為”http://localhost:7054”
該命令訪問本地Fabric CA服務, 采用默認的admin用戶進行登記. 默認情況下會在用戶目錄下的.fabric-ca-clien子目錄下創建默認的配置文件 fabric-ca-clien-config.yaml 和 msp 子目錄(包括簽發的證書文件)
可以使用 $ tree .fabric-ca-client/ 命令查看結構
注冊用戶
登記后的用戶身份可以采用如下命令來注冊一個新的用戶:
$ fabric-ca-client register --id.name kevin --id.type user --id.affiliation org1.department1 --id.attrs '"hf.Registrar.Roles=peer,user"' --id.attrs 'hf.Revoker=true'執行后輸出:
2018/05/02 14:39:28 [INFO] Configuration file location: /home/kevin/.fabric-ca-client/fabric-ca-client-config.yaml Password: KDwrXkAFENWW命令執行成功后返回該新注冊用戶的密碼
如果想使用指定的密碼, 在命令中添加選項 –id.secret password 即可
可以再次使用enroll命令,給kevin這個用戶生成msp的私鑰和證書
$ fabric-ca-client enroll -u http://kevin:KDwrXkAFENWW@localhost:7054 -M kevinca-M: 指定生成證書存放目錄MSP的路徑, 默認為”msp”
命令執行成功后會在 .fabric-ca-client 目錄下生成指定的userca目錄, 在此目錄下生成msp的私鑰和證書
可使用tree使用查看
$ tree .fabric-ca-client/輸出內容如下:
.fabric-ca-client/ ├── fabric-ca-client-config.yaml ├── kevinca │ ├── cacerts │ │ └── localhost-7054.pem │ ├── intermediatecerts │ │ └── localhost-7054.pem │ ├── keystore │ │ ├── 8c7e4d893af9b9a5907299097edd69c9adee743f4421f81a2d73ed55a874545e_sk │ │ └── ec63821399143fc422e01596eca622e8c658c0ded8e5c189804180256c40c19e_sk │ └── signcerts │ └── cert.pem ├── msp├── cacerts│ └── localhost-7054.pem├── intermediatecerts│ └── localhost-7054.pem├── keystore│ └── eaa009831dc406950766cc1df104f6fb3ed4b456faa5f476dc41db817a873d2a_sk└── signcerts└── cert.pem登記節點
登記Peer或Orderer節點的操作與登記用戶身份類似. 可以通過-M指定本地MSP的根路徑來在其下存放證書文件
注冊節點:
$ fabric-ca-client register --id.name peer0 --id.type peer --id.affiliation org1.department1 --id.secret peer0pw登記節點
$ fabric-ca-client enroll -u http://peer0:peer0pw@localhost:7054 -M peer0客戶端命令剖析
fabric-ca-client命令可以與服務端進行交互, 包括五個子命令:
- enroll: 登錄獲取ECert
- getcacert: 獲取CA服務的證書鏈
- reenroll: 再次登錄
- register: 注冊用戶實體
- revoke: 吊銷簽發的實體證書
這些命令都是通過服務端的RESTful接口來進行操作的
enroll命令
向服務端申請簽發ECert證書并將文件保存至本地
$ fabric-ca-client enroll -u http://admin:pass@localhost:7054getcacert命令
向服務端申請根證書信息并保存至本地主配置目錄的msp/cacerts路徑下
$ fabric-ca-client getcacert -u http://admin:pass@localhost:7054證書命名格式為: 服務器主機名-CA實例名.pem
reenroll命令
利用本地配置信息再次執行enroll過程, 生成新的簽名證書材料
$ fabric-ca-client reenrollregister命令
執行注冊新用戶實體的客戶端必須已經通過登記認證, 并且擁有足夠的權限(所注冊用戶的hf.Registrar.Roles和affiliation都不能超出調用者屬性)來進行注冊
$ fabric-ca-client register --id.name jack --id.type user --id.affiliation org1.department1 --id.attrs '"hf.Registrar.Roles=peer,user"' --id.attrs 'hf.Revoker=true' --id.secret jackpwrevoke命令
吊銷指定的證書或指定實體相關的所有證書. 執行revoke命令的客戶端身份必須擁有足夠的權限(hf.Revoker為true, 并且被吊銷者機構不能超出吊銷者機構的范圍)
$ fabric-ca-client revoke -e "jack" -r "affiliationchange"-e: 指定吊銷用戶
-r: 指定吊銷原因
輸出內容如下
2018/05/02 17:55:44 [INFO] Configuration file location: .fabric-ca-client/fabric-ca-client-config.yaml 2018/05/02 17:55:44 [INFO] Sucessfully revoked certificates: []查看AKI和序列號
AKI: 公鑰標識號, 代表了對該證書進行簽發機構的身份
查看根證書的AKI與序列號信息:
$ openssl x509 -in .fabric-ca-client/msp/signcerts/cert.pem -text -noout輸出內容如下:
Certificate:Data:Version: 3 (0x2)Serial Number: # 序列號74:48:88:33:70:1a:01:a0:ad:32:29:6e:c5:ab:5a:fa:3b:91:25:a4......X509v3 extensions:......X509v3 Authority Key Identifier: # keyid后面的內容就是 AKIkeyid:45:B1:50:B6:CD:8A:8D:C5:9B:9E:5F:75:15:47:D6:C0:AD:75:FE:71......單獨獲取AKI
$ openssl x509 -in .fabric-ca-client/msp/signcerts/cert.pem -text -noout | awk '/keyid/ {gsub (/ *keyid:|:/,"",$1);print tolower($0)}'輸出內容如下:
45b150b6cd8a8dc59b9e5f751547d6c0ad75fe71單獨獲取序列號
$ openssl x509 -in .fabric-ca-client/msp/signcerts/cert.pem -serial -noout | cut -d "=" -f 2輸出內容如下:
74488833701A01A0AD32296EC5AB5AFA3B9125A4 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Fabric--CA 应用与配置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fabric--configtxlato
- 下一篇: Fabric--node测试