Hyperledger Fabric CA的命令行用法

介紹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個文件:

  1. server配置文件
    ${FABRIC_CA_SERVER_HOME}/fabric-ca-server-config.yaml
  2. server內部存儲數據庫文件
    ${FABRIC_CA_SERVER_HOME}/fabric-ca-server.db
  3. 自我認證身份的證書文件
    ${FABRIC_CA_SERVER_HOME}/ca-cert.pem
  4. 自我認證身份的私鑰(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,如果需要使用非默認配置文件,只需要通過命令行參數--config指定文件名即可。

另,我們看到server端的主要操作有兩步完成,第一步初始化,第二步啟動;實際上兩步可以合并成一步,即直接執(zhí)行第二步啟動就可以,因為在啟動過程中如果發(fā)現還沒有進行過初始化,那么會自動執(zhí)行初始化的操作;那為什么需要分成兩步呢,因為初始化完成之后用戶可能需要對配置文件進行修改,調整參數和配置,然后在啟動,而如果直接執(zhí)行第二步就沒有機會修改和調整配置了。

啟動完之后可以發(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啟動的時候就內置進去的;后面的很多操作都需要管理員的身份,所以這一步先要獲取管理員的身份資格,才能往下操作,比如添加新的角色身份,添加新的管理員等等。

${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個文件:

  1. client配置文件
    ${FABRIC_CA_CLIENT_HOME}/fabric-ca-client-config.yaml
  2. CA根證書文件
    ${FABRIC_CA_CLIENT_HOME}/msp/cacerts/localhost-7054.pem
    這個文件其實就是server端的自我認證身份的證書文件,即${FABRIC_CA_SERVER_HOME}/ca-cert.pem一致
  3. client證書文件
    ${FABRIC_CA_CLIENT_HOME}/msp/signcerts/cert.pem
  4. client私鑰(private key)文件
    ${FABRIC_CA_CLIENT_HOME}/msp/keystore/338dc8051e6aa74bcbc1ee7da17afb735e0d8c1291f0a6b6d98bfce605a774ba_sk

再看server端數據庫的變化,可以看到表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的內容就是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參數必須是是server端配置文件fabric-ca-server-config.yaml里hf.Registrar.Roles屬性值里的一個。
  • --id.affiliation參數表示被注冊對象的從屬關系參數一定要歸屬于預先配置的組織屬性。換句話說,被注冊對象的affiliation參數一定要是預先配置的affiliation參數的一個前綴。例如,假設預先配置的組織關系為:“a.b.c”,那么新注冊的對象的affiliation屬性可以是“a.b.c”,也可以是“a.b”,但“a.c”就不能通過注冊。

再看server端數據庫的變化,可以看到表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端數據庫的變化,和自證管理員身份認證一樣,會往certificates表里面插入一條數據,其內容是對應角色的證書信息。

6. 總結登記(register)和認證(enroll)的功能

總結起來,登記身份和認證身份分別完成的功能是:

  1. 登記身份用來登記一個身份
    它需要提供待登記身份的身份信息,包含用戶名,密碼,類型,組織關系,等屬性。
    實施登記的人,還需要有登記的權限,例如初始的自證管理員,或其他管理員身份。
    登記過程不會生成本地文件,但是會往server的數據庫表users中插入一條數據。
  2. 認證身份用來認證一個前面已經登記過的身份
    它需要提供登記時身份的名字和密碼;實施認證不需要認證的權利。
    認證過程會生成本地文件,包括client配置文件,client證書文件,client私鑰文件,和根證書文件。
    同時在server端會把client的證書寫入數據庫表certificates中。

這也就是client三個步驟里面,第一步就需要做自證管理員身份的認證操作,因為此時客戶端沒有任何證書身份信息,只有自證管理員的名字和密碼,可以完成自證管理員的認證操作;完成后本地就有自證管理員的身份信息包括證書文件,私鑰;有了這些信息,才可以操作接下來的登記其他身份操作,因為登記一個身份需要具有登記權限的人才能做,既然剛才已經完成了自證管理員的認證操作,那么本地身份就是自證管理員,因此可以以自證管理員身份進行其他的登記操作。

另外要注意的是,在認證身份的時候會把之前已經存在的所有配置文件(包括client配置文件,client證書文件,client私鑰文件,根證書文件)都重新寫掉,文檔上說可以通過命令行指定不同的文件名,但是經過試驗好像不靈,不知道這是我使用上的問題,還是程序bug。所以在我們例子中當完成用戶tester的認證之后,本地的證書信息就被覆蓋成tester的了,此時再進行用戶登記操作就會失敗,因為本地用戶已經是tester了,而不是最初的自證管理員了,而tester用戶不具有登記用戶的權限。辦法就是重新認證自證管理員身份。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現,斷路器,智...
    卡卡羅2017閱讀 134,837評論 18 139
  • 1. 整體概覽# 在Fabric 1.0版本中,原0.6版本中的“Membership Service”已經被“F...
    __NeverMore__閱讀 6,520評論 7 17
  • 本文摘自 騰訊bugly 的文章《全站 HTTPS 來了》,內容有修改。 大家在使用百度、谷歌或淘寶的時候,是否注...
    bnotes閱讀 3,683評論 1 9
  • 晚上和兒子一起組裝網購的書柜,雖然老爸一再說,要我等翟大仙回來了再裝,怎奈得我滿滿的自信,面對一堆堆的木頭片片...
    米妞閱讀 204評論 0 0
  • 這世上,沒有任何美麗可以所向披靡,即使埃及艷后的絕代姿容,可以傾倒羅馬軍隊,卻不能讓屋大維動容,但真誠的笑容和發(fā)自...
    程自信閱讀 506評論 4 8