介紹Hyperledger Fabric CA的命令行方式簡單用法
Hyperledger Fabric CA由server和client兩部分組成涌献。
設置兩個環(huán)境變量
export FABRIC_CA_SERVER_HOME=/path_to/fabric-ca/server
export FABRIC_CA_CLIENT_HOME=/path_to/fabric-ca/client
server的操作主要有兩個:
1. 初始化Server服務
在server啟動之前胖烛,需要至少有一個自我認證的身份存在碗暗,這個步驟主要會創(chuàng)建這個自我認證的身份竞端。
${FABRIC_CA_SERVER_HOME}/fabric-ca-server init -b admin:adminpw
2017/10/09 13:44:47 [INFO] Created default configuration file at /path_to/fabric-ca/server/fabric-ca-server-config.yaml
2017/10/09 13:44:47 [INFO] generating key: &{A:ecdsa S:256}
2017/10/09 13:44:47 [INFO] encoded CSR
2017/10/09 13:44:47 [INFO] signed certificate with serial number 140063197993174970535175712880510082344059841460
2017/10/09 13:44:47 [INFO] The CA key and certificate were generated for CA
2017/10/09 13:44:47 [INFO] The key was stored by BCCSP provider 'SW'
2017/10/09 13:44:47 [INFO] The certificate is at: /path_to/fabric-ca/server/ca-cert.pem
2017/10/09 13:44:47 [INFO] Initialized sqlite3 database at /path_to/fabric-ca/server/fabric-ca-server.db
2017/10/09 13:44:47 [INFO] Home directory for default CA: /path_to/fabric-ca/server
2017/10/09 13:44:47 [INFO] Initialization was successful
命令執(zhí)行完成后生成如下4個文件:
- server配置文件
${FABRIC_CA_SERVER_HOME}/fabric-ca-server-config.yaml - server內(nèi)部存儲數(shù)據(jù)庫文件
${FABRIC_CA_SERVER_HOME}/fabric-ca-server.db - 自我認證身份的證書文件
${FABRIC_CA_SERVER_HOME}/ca-cert.pem - 自我認證身份的私鑰(private key)文件${FABRIC_CA_SERVER_HOME}/msp/keystore/27554ec70fe8a2707c0a74ba5d6ecb36a0a4d565871c4f050ed93d662849560d_sk
其中${FABRIC_CA_SERVER_HOME}/fabric-ca-server.db是一個sqlite文件,包含三個表:
1. table affiliations
name VARCHAR(64) | prekey VARCHAR(64)
------------------+--------------------+
org1 | |
org1.department1 |org1 |
org1.department2 |org1 |
org2 | |
org2.department1 |org2 |
------------------+--------------------+
2. table certificates
<no date>
3. table users
id VARCHAR(64) | token bytea | type VARCHAR(64) | affiliation VARCHAR(64) | attributes VARCHAR(256) | state INTEGER | max_enrollments INTEGER |
----------------+-------------------------------------------------------------+------------------+-------------------------+--------------------------+---------------+---------------------------+
admin |$2a$10$9AVqV7I8tGvA0GPUbAuTluzTEiJwb1F1MHw2OjywGPqTeIH/5pvH6 |client | | <see bellow> | 0 | -1 |
----------------+-------------------------------------------------------------+------------------+-------------------------+--------------------------+---------------+---------------------------+
attributes=[{"name":"hf.Registrar.DelegateRoles","value":"client,user,validator,auditor"},{"name":"hf.Revoker","value":"1"},{"name":"hf.IntermediateCA","value":"1"},{"name":"hf.Registrar.Roles","value":"client,user,peer,validator,auditor"}]
2. 啟動Server服務
初始化完成之后就可以啟動server。
${FABRIC_CA_SERVER_HOME}/fabric-ca-server start -b admin:adminpw
2017/10/09 12:17:04 [INFO] Configuration file location: /path_to/fabric-ca/fabric-ca-server-config.yaml
2017/10/09 12:17:04 [INFO] Starting server in home directory: /path_to/fabric-ca
2017/10/09 12:17:04 [INFO] The CA key and certificate already exist
2017/10/09 12:17:04 [INFO] The key is stored by BCCSP provider 'SW'
2017/10/09 12:17:04 [INFO] The certificate is at: /path_to/fabric-ca/ca-cert.pem
2017/10/09 12:17:04 [INFO] Initialized sqlite3 database at /path_to/fabric-ca/fabric-ca-server.db
2017/10/09 12:17:04 [INFO] Home directory for default CA: /path_to/fabric-ca
2017/10/09 12:17:04 [INFO] Listening on %!s(int=7054)%!(EXTRA string=http://0.0.0.0:7054)
這里,啟動過程使用默認的配置文件墓阀,即在初始化階段生成的${FABRIC_CA_SERVER_HOME}/fabric-ca-server-config.yaml,如果需要使用非默認配置文件拓轻,只需要通過命令行參數(shù)--config指定文件名即可斯撮。
另,我們看到server端的主要操作有兩步完成扶叉,第一步初始化勿锅,第二步啟動;實際上兩步可以合并成一步枣氧,即直接執(zhí)行第二步啟動就可以溢十,因為在啟動過程中如果發(fā)現(xiàn)還沒有進行過初始化,那么會自動執(zhí)行初始化的操作达吞;那為什么需要分成兩步呢张弛,因為初始化完成之后用戶可能需要對配置文件進行修改,調(diào)整參數(shù)和配置酪劫,然后在啟動吞鸭,而如果直接執(zhí)行第二步就沒有機會修改和調(diào)整配置了。
啟動完之后可以發(fā)送如下命令檢查時候工作正常
$ curl -i -uadmin:adminpw -X POST -H "Content-type:application/json" http://localhost:7054/cainfo
HTTP/1.1 200 OK
Content-Type: application/json
Date: Tue, 10 Oct 2017 05:42:16 GMT
Content-Length: 1127
{
"success":true,
"result":{
"CAName":"",
"CAChain":"LS0tLS1CRUdJT......tLS0K"
},
"errors":[],
"messages":[]
}
下面三步是客戶端的操作
3. 完成自證管理員身份認證
自證管理員是在server啟動的時候就內(nèi)置進去的覆糟;后面的很多操作都需要管理員的身份刻剥,所以這一步先要獲取管理員的身份資格,才能往下操作滩字,比如添加新的角色身份造虏,添加新的管理員等等。
${FABRIC_CA_CLIENT_HOME}/fabric-ca-client enroll -u http://admin:adminpw@localhost:7054
2017/10/09 15:58:40 [INFO] User provided config file: /path_to/fabric-ca/client/fabric-ca-client-config.yaml
2017/10/09 15:58:40 [INFO] Created a default configuration file at /path+_to/fabric-ca/client/fabric-ca-client-config.yaml
2017/10/09 15:58:40 [INFO] generating key: &{A:ecdsa S:256}
2017/10/09 15:58:40 [INFO] encoded CSR
2017/10/09 15:58:40 [INFO] Stored client certificate at /path_to/fabric-ca/client/msp/signcerts/cert.pem
2017/10/09 15:58:40 [INFO] Stored CA root certificate at /path_to/fabric-ca/client/msp/cacerts/localhost-7054.pem
端口7054是server的默認端口麦箍,可以在server配置文件里${FABRIC_CA_SERVER_HOME}/fabric-ca-server-config.yaml進行修改漓藕。
命令執(zhí)行完之后生成如下4個文件:
- client配置文件
${FABRIC_CA_CLIENT_HOME}/fabric-ca-client-config.yaml - CA根證書文件
${FABRIC_CA_CLIENT_HOME}/msp/cacerts/localhost-7054.pem
這個文件其實就是server端的自我認證身份的證書文件,即${FABRIC_CA_SERVER_HOME}/ca-cert.pem一致 - client證書文件
${FABRIC_CA_CLIENT_HOME}/msp/signcerts/cert.pem - client私鑰(private key)文件
${FABRIC_CA_CLIENT_HOME}/msp/keystore/338dc8051e6aa74bcbc1ee7da17afb735e0d8c1291f0a6b6d98bfce605a774ba_sk
再看server端數(shù)據(jù)庫的變化内列,可以看到表certificates里面多了一條記錄:
1. certificates
id VARCHAR(64) | serial_number blob | authority_key_identifier blob | ca_label blob | status blob | reason int | expiry timestamp | revoked_at timestamp | pem blob |
---------------+-----------------------------------------+------------------------------------------+---------------+------------------------------------------------------+---------------------------+----------+
admin | 5b5c9e1859b1798088cf096c7f249301512fdc8 | bf588926fdff01c07124099d0455846fae32ecde | | good | 0 | 2018-10-09 07:54:00+00:00 | 0001-01-01 00:00:00+00:00 | <bellow> |
---------------+-----------------------------------------+------------------------------------------+---------------+------------------------------------------------------+---------------------------+----------+
pem blob=
-----BEGIN CERTIFICATE-----
MIICVjCCAfygAwIBAgIUBbXJ4YWbF5gIjPCWx/JJMBUS/cgwCgYIKoZIzj0EAwIw
aDELMAkGA1UEBhMCVVMxFzAVBgNVBAgTDk5vcnRoIENhcm9saW5hMRQwEgYDVQQK
...
A0gAMEUCIQDVO1GO+9k+g7hbuevLh/YRq9LQNptu6IaJOAzLuPdCeQIgcMvfoKuv
Y+W2JC70/xbL4yimpt86k55CA/aqyrmq5+0=
-----END CERTIFICATE-----
實際上這個pem的內(nèi)容就是client的證書文件撵术,即${FABRIC_CA_CLIENT_HOME}/msp/signcerts/cert.pem一致。
4. 登記普通角色身份(register)
如下示例话瞧,我們使用 admin 的身份及其配套證書嫩与,登記了一個名稱為 "tester"寝姿、類型為 "user"、組織關系為 "org1.department1"划滋、"hf.Revoker" 屬性為 "true" 的新角色:
${FABRIC_CA_CLIENT_HOME}/fabric-ca-client register --id.name tester --id.secret testpasswd --id.type user --id.affiliation org1.department1 --id.attrs hf.Revoker=true
or
${FABRIC_CA_CLIENT_HOME}/fabric-ca-client register --id.name tester02 --id.secret testpasswd --id.type user --id.affiliation org1.department2 --id.attrs 'hf.Revoker=true,admin=true:ecert'
這地方需要注意的是:
- --id.type參數(shù)必須是是server端配置文件fabric-ca-server-config.yaml里hf.Registrar.Roles屬性值里的一個饵筑。
- --id.affiliation參數(shù)表示被注冊對象的從屬關系參數(shù)一定要歸屬于預先配置的組織屬性。換句話說处坪,被注冊對象的affiliation參數(shù)一定要是預先配置的affiliation參數(shù)的一個前綴根资。例如,假設預先配置的組織關系為:“a.b.c”同窘,那么新注冊的對象的affiliation屬性可以是“a.b.c”玄帕,也可以是“a.b”,但“a.c”就不能通過注冊想邦。
再看server端數(shù)據(jù)庫的變化裤纹,可以看到表users里面多了一條記錄。
1. table users
id VARCHAR(64) | token bytea | type VARCHAR(64) | affiliation VARCHAR(64) | attributes VARCHAR(256) | state INTEGER | max_enrollments INTEGER |
----------------+--------------------------------------------------------------+------------------+-------------------------+--------------------------+---------------+---------------------------+
admin | $2a$10$9AVqV7I8tGvA0GPUbAuTluzTEiJwb1F1MHw2OjywGPqTeIH/5pvH6 | client | | <see bellow> | 0 | -1 |
tester | $2a$10$kOuCBi8IHk8tAUD9afNtLOYBmiYcse4rLdURILoumuJCI69FVDm2O | user | org1.department1 | <see bellow> | 0 | -1 |
----------------+--------------------------------------------------------------+------------------+-------------------------+--------------------------+---------------+---------------------------+
attributes=[{"name":"hf.Registrar.DelegateRoles","value":"client,user,validator,auditor"},{"name":"hf.Revoker","value":"1"},{"name":"hf.IntermediateCA","value":"1"},{"name":"hf.Registrar.Roles","value":"client,user,peer,validator,auditor"}]
attributes=[{"name":"hf.Revoker","value":"true"}]
5. 認證普通角色身份(enroll)
完成身份登記之后需要做認證丧没。
${FABRIC_CA_CLIENT_HOME}/fabric-ca-client enroll -u http://tester:testpasswd@localhost:7054
or
${FABRIC_CA_CLIENT_HOME}/fabric-ca-client enroll -u http://tester02:testpasswd@localhost:7054
2017/10/09 13:34:52 [INFO] User provided config file: /path_to/fabric-ca-client/fabric-ca-client-config.yaml
2017/10/09 13:34:52 [INFO] generating key: &{A:ecdsa S:256}
2017/10/09 13:34:52 [INFO] encoded CSR
2017/10/09 13:34:52 [INFO] Stored client certificate at /path_to/fabric-ca-client/msp/signcerts/cert.pem
2017/10/09 13:34:52 [INFO] Stored CA root certificate at /path_to/fabric-ca-client/msp/cacerts/localhost-7054.pem
完成角色認證后鹰椒,再看server端數(shù)據(jù)庫的變化,和自證管理員身份認證一樣呕童,會往certificates表里面插入一條數(shù)據(jù)漆际,其內(nèi)容是對應角色的證書信息。
6. 總結登記(register)和認證(enroll)的功能
總結起來夺饲,登記身份和認證身份分別完成的功能是:
- 登記身份用來登記一個身份
它需要提供待登記身份的身份信息奸汇,包含用戶名,密碼钞支,類型茫蛹,組織關系操刀,等屬性烁挟。
實施登記的人,還需要有登記的權限骨坑,例如初始的自證管理員撼嗓,或其他管理員身份。
登記過程不會生成本地文件欢唾,但是會往server的數(shù)據(jù)庫表users中插入一條數(shù)據(jù)且警。 - 認證身份用來認證一個前面已經(jīng)登記過的身份
它需要提供登記時身份的名字和密碼;實施認證不需要認證的權利礁遣。
認證過程會生成本地文件斑芜,包括client配置文件,client證書文件祟霍,client私鑰文件杏头,和根證書文件盈包。
同時在server端會把client的證書寫入數(shù)據(jù)庫表certificates中。
這也就是client三個步驟里面醇王,第一步就需要做自證管理員身份的認證操作呢燥,因為此時客戶端沒有任何證書身份信息,只有自證管理員的名字和密碼寓娩,可以完成自證管理員的認證操作叛氨;完成后本地就有自證管理員的身份信息包括證書文件,私鑰棘伴;有了這些信息寞埠,才可以操作接下來的登記其他身份操作,因為登記一個身份需要具有登記權限的人才能做焊夸,既然剛才已經(jīng)完成了自證管理員的認證操作畸裳,那么本地身份就是自證管理員,因此可以以自證管理員身份進行其他的登記操作淳地。
另外要注意的是怖糊,在認證身份的時候會把之前已經(jīng)存在的所有配置文件(包括client配置文件,client證書文件颇象,client私鑰文件伍伤,根證書文件)都重新寫掉,文檔上說可以通過命令行指定不同的文件名遣钳,但是經(jīng)過試驗好像不靈扰魂,不知道這是我使用上的問題,還是程序bug蕴茴。所以在我們例子中當完成用戶tester的認證之后劝评,本地的證書信息就被覆蓋成tester的了,此時再進行用戶登記操作就會失敗倦淀,因為本地用戶已經(jīng)是tester了蒋畜,而不是最初的自證管理員了,而tester用戶不具有登記用戶的權限撞叽。辦法就是重新認證自證管理員身份姻成。