Fabric CA概述
下圖展示了Hyperledger Fabric CA服務器在整個Heyperledger Fabric架構中的定位:
有兩種方式可以與Hyperledger Fabric CA服務器交互:
- 使用Hyperledger Fabric CA客戶端
- 使用某種特定開發語言的Farbic SDK。
所有與Hyperledger Fabric CA服務器的通信都是 使用REST API。可以查看fabric-ca/swagger/swagger-fabric-ca.json文件以獲得這些REST API的swagger文檔。也可以在線訪問http://editor2.swagger.io以查看文檔。
Hyperledger Fabric CA客戶端或SDK可能連接到Hyperledger Fabric CA服務器集羣 中的一個服務器,這一點可以查看上圖的右上部分。客戶端將請求提交給HA代理訪問 端結點,HA代理進行負載均衡,並將客戶端的請求路由給fabric-ca-server集羣中的 某一成員服務器。
集羣中的所有Hyperledger Fabric CA服務器共用同一個數據庫,以跟蹤身份和證書。 如果配置了LDAP,那麼身份信息將保存在LDAP中而不是數據庫裏。
一個服務器可能包含多個CA,每個CA可能是根CA或者中間CA。每個中間CA都有一個 父級CA,該父級CA要麼是根CA,要麼是中間CA。
Fabric CA服務器概述
可以在啓動Fabric CA服務器之前先進行初始化。這讓我們有機會 生成默認的配置文件,以便在啓動服務器之前進行自定義調整。
Fabric CA服務器的主目錄按以下邏輯確定:
如果命令行存在-home選項,那麼使用該選項值
- 否則,如果存在FABRIC_CA_SERVER_HOME環境變量,那麼使用該環境變量值
- 否則,如果存在FABRIC_CA_HOME環境變量,那麼使用該環境變量值
- 否則,如果存在CA_CFG_PATH環境變量,那麼使用該環境變量值
- 否則,使用當前工作目錄
Fabric CA 啓動和測試
docker fabric-ca-server啓動
cd $gopath/src/github.com/hyperledger/fabric-ca/docker/server
如果想要使用不同fabric-ca版本,修改docker-compose.yml
image: hyperledger/fabric-ca
+ image: hyperledger/fabric-ca:1.4.6
執行
docker-compose up
docker啓動日誌
fabric-ca-server | 2020/04/14 03:48:43 [INFO] Configuration file location: /etc/hyperledger/fabric-ca-server/fabric-ca-server-config.yaml
fabric-ca-server | 2020/04/14 03:48:43 [INFO] Starting server in home directory: /etc/hyperledger/fabric-ca-server
fabric-ca-server | 2020/04/14 03:48:43 [INFO] Server Version: 1.4.6
fabric-ca-server | 2020/04/14 03:48:43 [INFO] Server Levels: &{Identity:2 Affiliation:1 Certificate:1 Credential:1 RAInfo:1 Nonce:1}
fabric-ca-server | 2020/04/14 03:48:43 [INFO] The CA key and certificate already exist
fabric-ca-server | 2020/04/14 03:48:43 [INFO] The key is stored by BCCSP provider 'SW'
fabric-ca-server | 2020/04/14 03:48:43 [INFO] The certificate is at: /etc/hyperledger/fabric-ca-server/ca-cert.pem
fabric-ca-server | 2020/04/14 03:48:43 [INFO] Initialized sqlite3 database at /etc/hyperledger/fabric-ca-server/fabric-ca-server.db
fabric-ca-server | 2020/04/14 03:48:43 [INFO] The Idemix issuer public and secret key files already exist
fabric-ca-server | 2020/04/14 03:48:43 [INFO] secret key file location: /etc/hyperledger/fabric-ca-server/msp/keystore/IssuerSecretKey
fabric-ca-server | 2020/04/14 03:48:43 [INFO] public key file location: /etc/hyperledger/fabric-ca-server/IssuerPublicKey
fabric-ca-server | 2020/04/14 03:48:43 [INFO] The Idemix issuer revocation public and secret key files already exist
fabric-ca-server | 2020/04/14 03:48:43 [INFO] private key file location: /etc/hyperledger/fabric-ca-server/msp/keystore/IssuerRevocationPrivateKey
fabric-ca-server | 2020/04/14 03:48:43 [INFO] public key file location: /etc/hyperledger/fabric-ca-server/IssuerRevocationPublicKey
fabric-ca-server | 2020/04/14 03:48:44 [INFO] Home directory for default CA: /etc/hyperledger/fabric-ca-server
fabric-ca-server | 2020/04/14 03:48:44 [INFO] Operation Server Listening on 127.0.0.1:9443
fabric-ca-server | 2020/04/14 03:48:44 [INFO] Listening on http://0.0.0.0:7054
說明:
- 服務器自動創建默認的配置文件fabric-ca-server-config.yaml
- 服務器自動生成自簽名證書ca-cert.pem和ca-key.pem文件
- Fabric CA服務器將在端口7054監聽
- 生成sqlite3數據庫fabric-ca-server.db
docker啓動時,默認會執行
fabric-ca-server start -b admin:adminpw
表明:
進入docker ,可以查看默認Fabric CA服務器的主目錄爲 /etc/hyperledger/fabric-ca-server
docker exec -it 35cd0bf14a51 bash
root@35cd0bf14a51:/# echo $FABRIC_CA_HOME
/etc/hyperledger/fabric-ca-server
fabric-ca-client
fabric client 目錄
Fabric-CA 可以採用客戶端命令行或 RESTful API 在內的兩種方式與 Fabric-CA 服務端進行交互。其中最方便的方式是通過客戶端工具 fabric-ca-client。
Fabric-CA 客戶端的主目錄路徑設置如下:
如果設置了 --home 命令行選項,以此值爲首選;
如果沒有設置 --home ,則查找 FABRIC_CA_CLIENT_HOME 值;
否則,查找 FABRIC_CA_HOME 值;
否則,查找 CA_CFG_PATH 值;
如果都未設置,則使用 $HOME/.fabric-ca-client 作爲客戶端的主目錄。
如果沒有export FABRIC_CA_CLIENT_HOME,那麼fabric-ca-client就會去找FABRIC_CA_HOME目錄,也就是客戶端生成的數據都會跑到server的目錄中
fabric client 命令
fabric-ca-client 命令可以與服務端進行交互, 包括五個子命令:
- enroll: 登記獲取證書ECert
- register:登記用戶
- getcainfo:獲取CA服務的證書鏈
- reenroll:重新註冊
- revoke:撤銷簽發的證書身份
- version:Fabric-CA 客戶端版本信息
這些命令在執行時都是通過服務端的 RESTful 接口來進行操作的。
fabric-ca-client enroll
進入docker ,
docker exec -it 35cd0bf14a51 bash
$ mkdir -p /etc/hyperledger/fabric-ca-client/admin
$ export FABRIC_CA_CLIENT_HOME=/etc/hyperledger/fabric-ca-client/admin
$ fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
日誌
2020/04/17 07:36:49 [INFO] Created a default configuration file at /etc/hyperledger/fabric-ca-client/admin/fabric-ca-client-config.yaml
2020/04/17 07:36:49 [INFO] generating key: &{A:ecdsa S:256}
2020/04/17 07:36:49 [INFO] encoded CSR
2020/04/17 07:36:49 [INFO] Stored client certificate at /etc/hyperledger/fabric-ca-client/admin/msp/signcerts/cert.pem
2020/04/17 07:36:49 [INFO] Stored root CA certificate at /etc/hyperledger/fabric-ca-client/admin/msp/cacerts/localhost-7054.pem
2020/04/17 07:36:49 [INFO] Stored Issuer public key at /etc/hyperledger/fabric-ca-client/admin/msp/IssuerPublicKey
2020/04/17 07:36:49 [INFO] Stored Issuer revocation public key at /etc/hyperledger/fabric-ca-client/admin/msp/IssuerRevocationPublicKey
- 客戶端自動創建默認的配置文件fabric-ca-client-config.yaml,可以通過修改此配置文件修改CSR refer
- 客戶端證書使用256位ecdsa算法
- 客戶端申請證書的私鑰爲./msp/keystore/38fa9d6943c9dd5ee06941b215f91825f5f9699a5c6ea9503a39d4b6a48d7e11_sk refer
- 生成客戶端證書cert.pem,服務端數據庫的certificates表中會保存此證書,用於和服務端通信 refer
- 服務端證書localhost-7054.pem,用於和服務端通信
- 生成客戶端零知識證明組件Idemix(Identity Mixer)的IssuerPublicKey和IssuerRevocationPublicKey refer
當客戶端執行完了fabric-ca-client enroll -u http://admin:adminpw@localhost:7054之後,會在fabric-ca-server的數據庫的certificates表中插入一條數據
id: admin # 用戶id
serial_number: 319a43b31df518726303709400551a8be3ec9c9c #證書id
authority_key_identifier: 26656bcad5fb8bfd47f0a81639328cd15224e1f1 #權限key,同一個用戶多次登記,值不變
ca_label:
status: good # 當前狀態好
reason: 0
expiry: 2021-04-17 09:47:00+00:00 # 過期時間,1年
revoked_at:
pem:
-----BEGIN CERTIFICATE-----
MIICPzCCAeagAwIBAgIUMZpDsx31GHJjA3CUAFUai+PsnJwwCgYIKoZIzj0EAwIw
aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK
EwtIeXBlcmxlZGdlcjEPMA0GA1UECxMGRmFicmljMRkwFwYDVQQDExBmYWJyaWMt
Y2Etc2VydmVyMB4XDTIwMDQxNzA5NDIwMFoXDTIxMDQxNzA5NDcwMFowXTELMAkG
A1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQKEwtIeXBl
cmxlZGdlcjEPMA0GA1UECxMGY2xpZW50MQ4wDAYDVQQDEwVhZG1pbjBZMBMGByqG
SM49AgEGCCqGSM49AwEHA0IABOMJp6m6NS74fNQMce5CkG7CrB6PossKBp4C8Y9V
hXGJqNS0jDvgNJBXBhgAPhpHQIym/QNHa/82GJ0G1LqwqyqjeTB3MA4GA1UdDwEB
/wQEAwIHgDAMBgNVHRMBAf8EAjAAMB0GA1UdDgQWBBQHWuJw+wPlcdaW+4NgyHem
N/SOTDAfBgNVHSMEGDAWgBQmZWvK1fuL/UfwqBY5MozRUiTh8TAXBgNVHREEEDAO
ggwzNWNkMGJmMTRhNTEwCgYIKoZIzj0EAwIDRwAwRAIgUawDVUCU6N25Ql169+cH
R5Xm3znSOEfGyOcygyOf0ewCIEZWzha4fXEklZnvtn0kAdY00VS2K4zbKYmIWQm7
pnZ8
-----END CERTIFICATE----- #ECert:Enrollment Certificate 客戶端獲取的登記證書,對應客戶端路徑msp/signcerts/cert.pem
level: 1