Fabric CA 是 Hyperledger Fabric 的官方配套認證設施。html
原文連接:http://hyperledger-fabric.readthedocs.io/en/latest/Setup/ca-setup.html前端
它提供的功能有:mysql
Fabric CA 屬於典型的 CS (Client and Server) 架構,官方代碼庫:https://github.com/hyperledger/fabric-ca 。git
開篇的圖示展示了 Fabric CA 服務端是如何參與到 Hyperledger Fabric 總體架構中去的。 github
與 Fabric CA 服務端交互的方式有以下兩種:算法
與 Fabric CA 服務端的全部通訊,都是經過 REST API 進行的。詳情可查看 fabric-ca/swagger/swagger-fabric-ca.json 處的 swagger 文檔中的 REST API 部分。sql
如前圖所示,Fabric CA 客戶端或 SDK 的請求首先會到達 Fabric CA 集羣前端的高可用負載均衡服務端,實際的 CA 服務由後端的某臺Fabric CA 服務端提供。同一集羣中的全部 Fabric CA 服務端共享相同的後端數據庫(或 LDAP)集羣,以確保證書和身份的一致性。docker
以下所示,將安裝 fabric-ca-server 與 fabric-ca-client 兩個終端命令行工具。數據庫
# go get -u github.com/hyperledger/fabric-ca/cmd/...
以下所示,將按默認配置啓動 Fabric CA 服務端,-b 選項用於指定管理員的帳號與密碼。json
# fabric-ca-server start -b admin:adminpw
默認將在當前目錄建立一個名爲 fabric-ca-server-config.yaml 的配置文件,該文件的存儲位置也能夠另行指定。
也能夠選擇在 Docker 環境下運行服務端,以下將建立並經過 docker-compose 啓動服務端
# cd $GOPATH/src/github.com/hyperledger/fabric-ca # make docker # cd docker/server # docker-compose up -d
名爲 hyperledger/fabric-ca 的 docker 鏡像中包含了 fabric-ca-server 與 fabric-ca-client 命令行工具。
fabric-ca-server 命令用法:
1 Hyperledger Fabric Certificate Authority Server 2 3 Usage: 4 fabric-ca-server [command] 5 6 Available Commands: 7 init Initialize the Fabric CA server 8 start Start the Fabric CA server 9 10 Flags: 11 --address string Listening address of Fabric CA server (default "0.0.0.0") 12 -b, --boot string The user:pass for bootstrap admin which is required to build default config file 13 --ca.certfile string PEM-encoded CA certificate file (default "ca-cert.pem") 14 --ca.chainfile string PEM-encoded CA chain file (default "ca-chain.pem") 15 --ca.keyfile string PEM-encoded CA key file (default "ca-key.pem") 16 -n, --ca.name string Certificate Authority name 17 -c, --config string Configuration file (default "fabric-ca-server-config.yaml") 18 --csr.cn string The common name field of the certificate signing request to a parent Fabric CA server 19 --csr.hosts stringSlice A list of space-separated host names in a certificate signing request to a parent Fabric CA server 20 --csr.serialnumber string The serial number in a certificate signing request to a parent Fabric CA server 21 --db.datasource string Data source which is database specific (default "fabric-ca-server.db") 22 --db.tls.certfiles stringSlice PEM-encoded list of trusted certificate files 23 --db.tls.client.certfile string PEM-encoded certificate file when mutual authenticate is enabled 24 --db.tls.client.keyfile string PEM-encoded key file when mutual authentication is enabled 25 --db.type string Type of database; one of: sqlite3, postgres, mysql (default "sqlite3") 26 -d, --debug Enable debug level logging 27 --ldap.enabled Enable the LDAP client for authentication and attributes 28 --ldap.groupfilter string The LDAP group filter for a single affiliation group (default "(memberUid=%s)") 29 --ldap.url string LDAP client URL of form ldap://adminDN:adminPassword@host[:port]/base 30 --ldap.userfilter string The LDAP user filter to use when searching for users (default "(uid=%s)") 31 -p, --port int Listening port of Fabric CA server (default 7054) 32 --registry.maxenrollments int Maximum number of enrollments; valid if LDAP not enabled 33 --tls.certfile string PEM-encoded TLS certificate file for server's listening port (default "ca-cert.pem") 34 --tls.clientauth.certfiles stringSlice PEM-encoded list of trusted certificate files 35 --tls.clientauth.type string Policy the server will follow for TLS Client Authentication. (default "noclientcert") 36 --tls.enabled Enable TLS on the listening port 37 --tls.keyfile string PEM-encoded TLS key for server's listening port (default "ca-key.pem") 38 -u, --url string URL of the parent Fabric CA server 39 40 41 Use "fabric-ca-server [command] --help" for more information about a command.
fabric-ca-client 命令用法:
1 # fabric-ca-client 2 Hyperledger Fabric Certificate Authority Client 3 4 Usage: 5 fabric-ca-client [command] 6 7 Available Commands: 8 enroll Enroll an identity 9 getcacert Get CA certificate chain 10 reenroll Reenroll an identity 11 register Register an identity 12 revoke Revoke an identity 13 14 Flags: 15 -c, --config string Configuration file (default "$HOME/.fabric-ca-client/fabric-ca-client-config.yaml") 16 --csr.cn string The common name field of the certificate signing request 17 --csr.hosts stringSlice A list of space-separated host names in a certificate signing request 18 --csr.serialnumber string The serial number in a certificate signing request 19 -d, --debug Enable debug level logging 20 --enrollment.hosts string Comma-separated host list 21 --enrollment.label string Label to use in HSM operations 22 --enrollment.profile string Name of the signing profile to use in issuing the certificate 23 --id.affiliation string The identity's affiliation 24 --id.attr string Attributes associated with this identity (e.g. hf.Revoker=true) 25 --id.maxenrollments int The maximum number of times the secret can be reused to enroll 26 --id.name string Unique name of the identity 27 --id.secret string The enrollment secret for the identity being registered 28 --id.type string Type of identity being registered (e.g. 'peer, app, user') 29 -M, --mspdir string Membership Service Provider directory (default "msp") 30 -m, --myhost string Hostname to include in the certificate signing request during enrollment (default "$HOSTNAME") 31 --tls.certfiles stringSlice PEM-encoded list of trusted certificate files 32 --tls.client.certfile string PEM-encoded certificate file when mutual authenticate is enabled 33 --tls.client.keyfile string PEM-encoded key file when mutual authentication is enabled 34 -u, --url string URL of the Fabric CA server (default "http://localhost:7054") 35 36 Use "fabric-ca-client [command] --help" for more information about a command.
注:參數類型標記爲「stringSlice」的選項,表示能夠批量指定多個參數,形如—— "string0 string1 ... stringN" 的形式,此時外層必須有雙引號,且各項之間以空格分開;屢次分開指定則不須要加雙引號,如 -csr.hosts "host1 host2" 與 -csr.hosts host1 -csr.hosts host2 效果相同。
服務端啓動時,能夠經過 -c 或 --config 選項指定配置文件,若目標文件不存在,將在指定路徑建立一個默認配置文件(若不提供 -c 或 --config 選項,則在服務端的家目錄下建立),內容相似以下:
1 # Server's listening port (default: 7054) 2 port: 7054 3 4 # Enables debug logging (default: false) 5 debug: false 6 7 ############################################################################# 8 # TLS section for the server's listening port 9 ############################################################################# 10 tls: 11 # Enable TLS (default: false) 12 enabled: false 13 certfile: ca-cert.pem 14 keyfile: ca-key.pem 15 16 ############################################################################# 17 # The CA section contains the key and certificate files used when 18 # issuing enrollment certificates (ECerts) and transaction 19 # certificates (TCerts). 20 ############################################################################# 21 ca: 22 # Certificate file (default: ca-cert.pem) 23 certfile: ca-cert.pem 24 # Key file (default: ca-key.pem) 25 keyfile: ca-key.pem 26 27 ############################################################################# 28 # The registry section controls how the Fabric CA server does two things: 29 # 1) authenticates enrollment requests which contain identity name and 30 # password (also known as enrollment ID and secret). 31 # 2) once authenticated, retrieves the identity's attribute names and 32 # values which the Fabric CA server optionally puts into TCerts 33 # which it issues for transacting on the Hyperledger Fabric blockchain. 34 # These attributes are useful for making access control decisions in 35 # chaincode. 36 # There are two main configuration options: 37 # 1) The Fabric CA server is the registry 38 # 2) An LDAP server is the registry, in which case the Fabric CA server 39 # calls the LDAP server to perform these tasks. 40 ############################################################################# 41 registry: 42 # Maximum number of times a password/secret can be reused for enrollment 43 # (default: 0, which means there is no limit) 44 maxEnrollments: 0 45 46 # Contains identity information which is used when LDAP is disabled 47 identities: 48 - name: <<<ADMIN>>> 49 pass: <<<ADMINPW>>> 50 type: client 51 affiliation: "" 52 attrs: 53 hf.Registrar.Roles: "client,user,peer,validator,auditor,ca" 54 hf.Registrar.DelegateRoles: "client,user,validator,auditor" 55 hf.Revoker: true 56 hf.IntermediateCA: true 57 58 ############################################################################# 59 # Database section 60 # Supported types are: "sqlite3", "postgres", and "mysql". 61 # The datasource value depends on the type. 62 # If the type is "sqlite3", the datasource value is a file name to use 63 # as the database store. Since "sqlite3" is an embedded database, it 64 # may not be used if you want to run the Fabric CA server in a cluster. 65 # To run the Fabric CA server in a cluster, you must choose "postgres" 66 # or "mysql". 67 ############################################################################# 68 db: 69 type: sqlite3 70 datasource: fabric-ca-server.db 71 tls: 72 enabled: false 73 certfiles: 74 - db-server-cert.pem 75 client: 76 certfile: db-client-cert.pem 77 keyfile: db-client-key.pem 78 79 ############################################################################# 80 # LDAP section 81 # If LDAP is enabled, the Fabric CA server calls LDAP to: 82 # 1) authenticate enrollment ID and secret (i.e. identity name and password) 83 # for enrollment requests 84 # 2) To retrieve identity attributes 85 ############################################################################# 86 ldap: 87 # Enables or disables the LDAP client (default: false) 88 enabled: false 89 # The URL of the LDAP server 90 url: ldap://<adminDN>:<adminPassword>@<host>:<port>/<base> 91 tls: 92 certfiles: 93 - ldap-server-cert.pem 94 client: 95 certfile: ldap-client-cert.pem 96 keyfile: ldap-client-key.pem 97 98 ############################################################################# 99 # Affiliation section 100 ############################################################################# 101 affiliations: 102 org1: 103 - department1 104 - department2 105 org2: 106 - department1 107 108 ############################################################################# 109 # Signing section 110 ############################################################################# 111 signing: 112 profiles: 113 ca: 114 usage: 115 - cert sign 116 expiry: 8000h 117 caconstraint: 118 isca: true 119 default: 120 usage: 121 - cert sign 122 expiry: 8000h 123 124 ########################################################################### 125 # Certificate Signing Request section for generating the CA certificate 126 ########################################################################### 127 csr: 128 cn: fabric-ca-server 129 names: 130 - C: US 131 ST: North Carolina 132 L: 133 O: Hyperledger 134 OU: Fabric 135 hosts: 136 - <<<MYHOST>>> 137 ca: 138 pathlen: 139 pathlenzero: 140 expiry: 141 142 ############################################################################# 143 # Crypto section configures the crypto primitives used for all 144 ############################################################################# 145 crypto: 146 software: 147 hash_family: SHA2 148 security_level: 256 149 ephemeral: false 150 key_store_dir: keys
客戶端啓動時,能夠經過 -c 或 --config 選項指定配置文件,若目標文件不存在,將在指定路徑建立一個默認配置文件(若不提供 -c 或 --config 選項,則在客戶端的家目錄下建立),內容相似以下:
1 ############################################################################# 2 # Client Configuration 3 ############################################################################# 4 5 # URL of the Fabric CA server (default: http://localhost:7054) 6 URL: http://localhost:7054 7 8 # Membership Service Provider (MSP) directory 9 # When the client is used to enroll a peer or an orderer, this field must be 10 # set to the MSP directory of the peer/orderer 11 MSPDir: 12 13 ############################################################################# 14 # TLS section for secure socket connection 15 ############################################################################# 16 tls: 17 # Enable TLS (default: false) 18 enabled: false 19 certfiles: 20 client: 21 certfile: 22 keyfile: 23 24 ############################################################################# 25 # Certificate Signing Request section for generating the CSR for 26 # an enrollment certificate (ECert) 27 ############################################################################# 28 csr: 29 cn: <<<ENROLLMENT_ID>>> 30 names: 31 - C: US 32 ST: North Carolina 33 L: 34 O: Hyperledger 35 OU: Fabric 36 hosts: 37 - <<<MYHOST>>> 38 ca: 39 pathlen: 40 pathlenzero: 41 expiry: 42 43 ############################################################################# 44 # Registration section used to register a new identity with Fabric CA server 45 ############################################################################# 46 id: 47 name: 48 type: 49 affiliation: 50 attributes: 51 - name: 52 value: 53 54 ############################################################################# 55 # Enrollment section used to enroll an identity with Fabric CA server 56 ############################################################################# 57 enrollment: 58 hosts: 59 profile: 60 label:
以下三種方式,優先級依次下降(即:命令行優先於環境變量,環境變量優先於配置文件):
以下所示,配置文件中指定了證書名稱:
tls: # Enable TLS (default: false) enabled: false # TLS for the client's listenting port (default: false) certfiles: client: certfile: cert.pem keyfile:
若以後再定義以下環境變量,則有效證書名稱爲:cert2.pem
export FABRIC_CA_CLIENT_TLS_CLIENT_CERTFILE=cert2.pem
若以後再經過命令行指定以下內容,則有效證書名稱爲:cert3.pem
fabric-ca-client enroll --tls.client.certfile cert3.pem
注:配置文件中指定文件路徑時,可使用相對路徑(相對於該配置文件所在位置)或絕對路徑。
這一部分將詳細描述Fabric CA 服務端。
服務端家目錄位置,按以下規則肯定:
本部分接下來的介紹,將假設 FABRIC_CA_HOME 已初設定爲 $HOME/fabric-ca/server ,且服務端配置文件位於此目錄下。
如前所述,初始化服務端使用以下形式:
# fabric-ca-server init -b admin:adminpw
初始化時,須要 -b (bootstrap identity) 選項;服務端啓動,須要至少有一個自我認證的身份存在。
服務端配置文件中有一個 CSR (Certificate Signing Request) 區域,以下是一個示例。
若是需果經過 TLS 遠程鏈接到服務端,請將 cn 字段的值替換爲服務端 IP 或 域名:
cn: localhost key: algo: ecdsa size: 256 names: - C: US ST: "North Carolina" L: O: Hyperledger OU: Fabric
以上字段是由 fabric-ca-init 生成的,用於 X.509 簽名密鑰和證書,做用於配置文件中指定的 ca.certfile 與 ca.keyfile 。
各字段含義以下:
若是 CSR 區域的值須要自定義,首先刪除 ca.certfile 與 ca.keyfile 字段指定的文件,而後再次運行 fabric-ca-server init -b admin:adminpw 。
若是指定了 -u <parent-fabric-ca-server-URL> 選項,則 Fabric CA 服務端自身的證書由上級 CA 簽發;不然,fabric-ca-server init 將生成一個自簽證書,同時在服務端家目錄下生成一個名爲 fabric-ca-server-config.yaml 的默認配置文件。
算法和密鑰長度:
在 CSR 中能夠指定用於生成 X.509 密鑰和證書的算法,可選 RSA 或 ECDSA (Elliptic Curve Digital Signature Algorithm);以下示例使用 ecdsa-with-SHA256 算法:
key: algo: ecdsa size: 256
ECDSA 可選的密鑰長度:25六、38四、512;RSA 可選的密鑰長度:204八、4096 。
以下形式將啓動 Fabric CA 服務端:
# fabric-ca-server start -b admin:adminpw
若是此前沒有執行 fabric-ca-server init,將首先執行初始化動做,生成 ca-cert.pem、ca-key.pem 及一個默認配置文件。
除非使用基於 LDAP 的用戶認證,不然須要至少一個自認證管理員身份,用於登記和認證其它身份;此處的 -b 選項與 init 時的意義相同。
若是須要限制同一個管理員密碼能夠發放的證書總量,能夠設置 registry.maxEnrollments 爲適當的值,若設置爲 0,表示無限制,默認爲 0。
Fabric CA 服務端默認監聽在 7054 端口。
Fabric CA 默認使用的數據庫是 SQLite,默認數據庫文件位於服務端家目錄下的 fabric-ca-server.db。
能夠選擇使用 PostgreSQL 或 MySQL。
官方手冊:https://www.postgresql.org/docs/manuals
以下示例配置可用於鏈接 PostgreSQL,請確保其中的各個變量值被正確設置。
db: type: postgres datasource: host=localhost port=5432 user=Username password=Password dbname=fabric-ca-server sslmode=verify-full
若是須要使用 TLS 鏈接數據庫,則必須設置 Fabric CA 服務端配置文件中的 db.tls 部分;若 PostgreSQL 服務端啓用了針對客戶端的 SSL 認證,則須要同時指定 db.tls.client 部分。
以下是一份 db.tls 配置示例:
db:
...
tls:
enabled: true
certfiles:
- db-server-cert.pem
client:
certfile: db-client-cert.pem
keyfile: db-client-key.pem
certfiles 字段用於指定一個或多個 PEM 格式編碼的可信 ROOT CA 證書文件;certfile 與 keyfile 指定 PEM 格式編碼的證書和私鑰,在與 PostgreSQL 服務端通訊時,用於證實 Fabric CA 服務端的合法身份。
略...
略...
HAProxy 配置...略...
Fabric CA 客戶端的家目錄,由以下其中一個條件決定(優先級由高到低):
接下來的介紹,假定客戶端的配置文件存放於客戶端的有效家目錄下。
首先,修改配置文件,其中 csr.cn 字段必須與自認證的身份名稱相同。CSR 部分默認值以下:
csr: cn: <<enrollment ID>> key: algo: ecdsa size: 256 names: - C: US ST: North Carolina L: O: Hyperledger Fabric OU: Fabric CA hosts: - <<hostname of the fabric-ca-client>> ca: pathlen: pathlenzero: expiry:
以後,執行 fabric-ca-client enroll 命令進行身份認證。
以下示例,經過調用監聽在本地 7054 端口的服務端,對 ID:admin 與 PWD:adminpw 的管理員身份進行了自認證:
# export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin # fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
enroll 命令會將生成的 ECert(enrollment certificate),以及對應的私鑰及、CA 證書鏈(PEM 格式)存儲在子目錄 msp 中,命令執行成功後提示這些文件的存儲位置。
執行登記(register)行爲的角色自己首先要得到認證,並擁有認證目標角色的權限。
Fabric CA 服務端在執行登記的過程當中,會作兩項權限檢查:
以下示例,使用 admin 的身份及其配套證書,登記了一個名稱爲 "admin2"、類型爲 "user"、組織關係爲 "org1.department1"、"hf.Revoker" 屬性爲 "true" 的新角色:
# export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin # fabric-ca-client register --id.name admin2 --id.type user --id.affiliation org1.department1 --id.attr hf.Revoker=true
下一步(認證/enroll)所必須的密碼將會被打印出來,其它具備認證權限的身份(如:除 "admin" 以外的管理員)可使用這個密碼,對 "admin2" 進行直接認證,沒必要是本身先前親自登記的。
fabric-ca-client 命令的各個選項,均可以預先在配置文件中設置默認值,這樣執行對應操做的時候就能夠簡化選項,如有以下配置:
id: name: type: user affiliation: org1.department1 attributes: - name: hf.Revoker value: true - name: anotherAttrName value: anotherAttrValue
則上述登記命令可簡化爲:
# export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
# fabric-ca-client register --id.name admin2
以下命令登記了一個名爲 "peer1" 的身份,它是接下來的用於示例的被認證對象:
# export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
# fabric-ca-client register --id.name peer1 --id.type peer --id.affiliation org1.department1 --id.secret peer1pw
注意,下一步將要用到的認證密碼是能夠經過 --id.secret 手動指定的。
經過上一步已經成功登記了一個節點的身份,如今能夠經過指定被認證角色的 ID 和對應的密碼來執行認證,這與管理員角色自認證過程相似,除了此處演示了使用 -M 選項指定 MSP(Membership Service Provider) 路徑。
以下命令對 peer1 身份進行了認證,請將 -M 選項的值替換爲你所在的 Fabric CA 客戶端中名爲 core.yaml 的配置文件中的 'mspConfigPath' 字段的值:
# export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1 # fabric-ca-client enroll -u http://peer1:peer1pw@localhost:7054 -M $FABRIC_CA_CLIENT_HOME/msp
認證 orderer 角色的過程相似,只是要將 MSP 路徑的值替換爲 order 節點上的 orderer.yaml 文件中的 'LocalMSPDir' 字段指定的值。
證書鏈,便是從直接執行認證行爲的最下層 CA 機構,一直到最上層的根 CA 機構所通過的全部 CA 機構造成的線性依賴的證書集合。
一般 MSP 下存放證書的目錄中,必須包含對當前節點來講可信任的、全部各級證書頒發機構的證書。
fabric-ca-client getcacerts 命令用於從其它 Fabric CA 服務端獲取這些證書。
以下示例在本地啓動了一個監聽在 7055 端口、名爲 "CA2" 的服務端,這展現了一個在區塊鏈上由其它成員管理的徹底獨立的可信認證節點:
# export FABRIC_CA_SERVER_HOME=$HOME/ca2 # fabric-ca-server start -b admin:ca2pw -p 7055 -n CA2
以下命令將把 CA2 的證書安裝到 peer1 的 MSP 路徑下:
# export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1 # fabric-ca-client getcacert -u http://localhost:7055 -M $FABRIC_CA_CLIENT_HOME/msp
若是證書將要過時,或者已經處於不安全狀態,則須要從新認證獲取新的證書:
# export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/peer1
# fabric-ca-client reenroll
身份登記信息和證書是能夠被撤銷的。撤銷身份將使該身份所擁有的全部證書失效,而且會拒絕該身份申請新的證書;撤銷證書只對單個證書有效。
執行撤銷動做的角色必須具有 "hf.Revoker" 屬性,而且其組織關係是與被撤銷的對象處於同一部門或是其上級。例如:組織關係爲 "orgs.org1" 的角色能夠對組織關係爲 "orgs.org1.department1" 的角色執行撤銷動做,但不能對組織關係爲 "orgs.org2" 的角色執行撤銷動做。
以下命令撤銷了一個身份(同時會撤銷與其所擁有的全部證書),認身份將來的全部認證請求都會 Fabric CA 服務端拒絕:
# fabric-ca-client revoke -e <enrollment_id> -r <reason>
-r 選項可用的值有以下 10 項:
以下,擁有最頂級組織關係的 admin 自認證身份,能夠以以下方式註銷掉 peer1 的身份:
# export FABRIC_CA_CLIENT_HOME=$HOME/fabric-ca/clients/admin
# fabric-ca-client revoke -e peer1
能夠經過指定 AKI(Authority Key Identifier) 及其序列號來撤銷單個證書:
fabric-ca-client revoke -a xxx -s yyy -r <reason> #-s: serial number
某個證書的 AKI 與序列號能夠經過 openssl 命令獲取,如:
serial=$(openssl x509 -in userecert.pem -serial -noout | cut -d "=" -f 2) AKI=$(openssl x509 -in userecert.pem -text | awk '/keyid/ {gsub(/ *keyid:|:/,"",$1);print tolower($0)}') fabric-ca-client revoke -s $serial -a $AKI -r affiliationchange
如下將描述如何爲 Fabric CA 客戶端啓用 TLS 支持。
以相似以下的方式配置 fabric-ca-client-config.yaml 文件:
tls: # Enable TLS (default: false) enabled: true certfiles: - root.pem client: certfile: tls_client-cert.pem keyfile: tls_client-key.pem
certfiles 選項用於指定當前客戶端信任的根證書集合,這一般就是 Fabric CA 服務端家目錄下的 ca-cert.pem 文件。
client 部分的選項,只有當 Fabric CA 服務端啓用了 TLS 雙向認證策略時才須要。