### **1. 生成證書配置文件**
#### **1. 釋義**
在所有的系統中,必須要有賬號和密碼才可以進行操作。Fabric服務也是一樣,不過在 Fabric 網絡中,需要通過證書和密鑰來管理和鑒別成員身份,經常需要進行證書生成和配置操作 。通常這些操作可 以使用 PKI 服務或者 OpenSSL 工具來手動實現單個證書的簽發 。為了提高對負責組織結構和批量證書進行管理的效率,基于 Go 語言的 crypto 庫, Fabric提供了 cryptogen (Crypto Generator)工具 。 cryptogen 可 以快速地根據配置自動批量生成所需要 的密鑰和證書文件。
#### **2. 配置文件**
cryptogen 工具支持從配置文件 (通過- config 參數指定 ,通常命名為 crypto-config. yaml ) 中讀入YAML格式的配置模板信息 。配置文件中會指定網絡的拓撲結構,可以指定兩類組織的信息。
* 組織 OrdererOrgs :構成 Orderer 集群的節點所屬組織
* 組織 PeerOrgs :構成 Peer 集群的節點所屬組織
* 名稱 ( Name ) : 組織的名稱
* 組織域 ( Domain ):組織的命名域
* CA : 組織的 CA 地址,包括 Hostname域
* 若干節點( Node ) : 一個節點包括Hostname
* Specs 字段指定一組節點 , 或者用 Template 字段指定自動生成節點 的個數
* 用戶( User)模板: 自動生成除 admin 外的用戶個數
#### **3. 配置示例**
```
OrdererOrgs: # 排序節點的組織定義
- Name: Orderer # orderer節點的名稱
Domain: example.com # orderer節點的根域名
Specs:
- Hostname: orderer # orderer節點的主機名
PeerOrgs: # peer節點的組織定義
- Name: Org1 # 組織1的名稱 1 1
Domain: org1.example.com # 組織1的根域名
EnableNodeOUs: true
Template:
Count: 2 # 組織1中的節點(peer)數目
Users:
Count: 1 # 組織1中的用戶數目
- Name: Org2
Domain: org2.example.com
EnableNodeOUs: true
Template:
Count: 2
Users:
Count: 1
```
#### **4. 子命令和參數**
* generate \[flags]:生成密鑰和證書文件;
* showtemplate :查看配置模板的信息 。
其中, generate 子命令支持如下參數:
* 一output :指定存放生成密鑰和證書文件的路徑,默認為當前目錄下的 crypto-config 目錄
* 一config :指定所采用的配置模板文件的路徑
#### **5. 生成秘鑰和證書文件**
在配置文件同級目錄下執行:
```
$ cryptogen generate --config=./crycrypto-config.yaml --output ./crypto-config
```
#### **6. 生成秘鑰和證書文件解析**
查看當前目錄下的 crypto-config 目錄,生成 ordererOrganizations 和 peerOrganizations兩棵組織樹 。 每個組織樹下都包括 ca 、 msp 、 orderers (或 peers )、 users 四個子目錄 。
```
crypto-config$ tree
.
├── ordererOrganizations
│?? └── example.com
│?? ├── ca
│?? │?? ├── a0606a4a860a1e31c90a23788da6f3b6b74925ed0d23061af4899409ba46ae6a_sk
│?? │?? └── ca.example.com-cert.pem
│?? ├── msp
│?? │?? ├── admincerts
│?? │?? │?? └── Admin@example.com-cert.pem
│?? │?? ├── cacerts
│?? │?? │?? └── ca.example.com-cert.pem
│?? │?? └── tlscacerts
│?? │?? └── tlsca.example.com-cert.pem
│?? ├── orderers
│?? │?? └── orderer.example.com
│?? │?? ├── msp
│?? │?? │?? ├── admincerts
│?? │?? │?? │?? └── Admin@example.com-cert.pem
│?? │?? │?? ├── cacerts
│?? │?? │?? │?? └── ca.example.com-cert.pem
│?? │?? │?? ├── keystore
│?? │?? │?? │?? └── 4d2f776c0fef8eac3f460a7c3558dc7859c4fe458e262e674a6c23f242ea33d1_sk
│?? │?? │?? ├── signcerts
│?? │?? │?? │?? └── orderer.example.com-cert.pem
│?? │?? │?? └── tlscacerts
│?? │?? │?? └── tlsca.example.com-cert.pem
│?? │?? └── tls
│?? │?? ├── ca.crt
│?? │?? ├── server.crt
│?? │?? └── server.key
│?? ├── tlsca
│?? │?? ├── 8d2186556c85d515e737d0c0da8d0d7672785b685cb503bcb95e53dcc279fba7_sk
│?? │?? └── tlsca.example.com-cert.pem
│?? └── users
│?? └── Admin@example.com
│?? ├── msp
│?? │?? ├── admincerts
│?? │?? │?? └── Admin@example.com-cert.pem
│?? │?? ├── cacerts
│?? │?? │?? └── ca.example.com-cert.pem
│?? │?? ├── keystore
│?? │?? │?? └── 1deeab5433fa6e5f045eb763109d6165268fba153211af1281f00d45f54b1022_sk
│?? │?? ├── signcerts
│?? │?? │?? └── Admin@example.com-cert.pem
│?? │?? └── tlscacerts
│?? │?? └── tlsca.example.com-cert.pem
│?? └── tls
│?? ├── ca.crt
│?? ├── server.crt
│?? └── server.key
└── peerOrganizations
└── org1.example.com
├── ca*放組織的根證書和對應的私鑰文件
│?? ├── 4239aa0dcd76daeeb8ba0cda701851d14504d31aad1b2ddddbac6a57365e497c_sk
│?? ├── ca.org1.example.com-cert.pem
│?? └── org1.example.com-cert.pem
├── msp*存放代表該組織的身份信息
│?? ├── admincerts*組織管理員的身份驗證證書目錄
│?? │?? └── Admin@org1.example.com-cert.pem*組織管理員的身份驗證證書,被根證書簽名
│?? ├── cacerts*組織的根證書目錄
│?? │?? └── ca.org1.example.com-cert.pem*組織的根證書,同 ca 目錄下文件
│?? └── tlscacerts*TLS 的 CA 證書目錄
│?? └── tlsca.org1.example.com-cert.pem*用于 TLS 的 CA 證書,自簽名
├── peers*存放屬于該組織的所有 Peer 節點證書目錄
│?? └── peer0.org1.example.com*peer0節點
│?? ├── msp*組織的根證書目錄
│?? │?? ├── admincerts*組織管理員的身份驗證證書目錄
│?? │?? │?? └── Admin@org1.example.com-cert.pem*組織管理員的身份驗證證書,被根證書簽名
│?? │?? ├── cacerts*組織的根證書目錄
│?? │?? │?? └── ca.org1.example.com-cert.pem*組織的根證書文件
│?? │?? ├── keystore*本節點的身份私鑰目錄
│?? │?? │?? └── 46be1d569fe68f33e517c9e0072a0ccfbfb42727480fb8c8d0223af321a7893d_sk*節點身份私鑰
│?? │?? ├── signcert*驗證本節點簽名的證書目錄
│?? │?? │?? └── peer0.org1.example.com-cert.pem*驗證本節點簽名的證書目錄,被根證書簽名
│?? │?? └── tlscacerts*Tls連接證書目錄
│?? │?? └── tlsca.org1.example.com-cert.pem*組織tls證書
│?? └── tls*存放 Tls相關的證書和私鑰目錄
│?? ├── ca.crt*組織的根證書
│?? ├── server.crt*驗證本節點簽名的證書,被組織根證書簽名
│?? └── server.key*本節點的身份私鑰,用來簽名
├── tlsca*存放組織tls連接用的根證書和私鑰文件。
│?? ├── ed3fd82393e95fc2c475afc113c8d2c591f745d1babc4d6d9cce0a1acc168acb_sk
│?? └── tlsca.org1.example.com-cert.pem*TLS根證書
└── users*存放屬于該組織的用戶的實體
├── Admin@org1.example.com*
管理員用戶的信息,包括其msp證書和tls證書兩類
│?? ├── msp*組織根證書作為管理者身份驗證證書
│?? │?? ├── admincerts*組織根證書作為管理者身份驗證證書
│?? │?? │?? └── Admin@org1.example.com-cert.pem
│?? │?? ├── cacerts*組織的根證書
│?? │?? │?? └── ca.org1.example.com-cert.pem
│?? │?? ├── keystore*本用戶的身份私鑰
│?? │?? │?? └── cd96d5260ad4757551ed4a5a991e62130f8008a0bf996e4e4b84cd097a747fec_sk
│?? │?? ├── signcerts*管理員用戶的身份驗證證書,被組織根證書簽名。要被某個Peer認可,則必須放到該peer的msp/admincerts下。
│?? │?? │?? └── Admin@org1.example.com-cert.pem
│?? │?? └── tlscacerts*TLS連接用的身份證書,即組織TLS證書。
│?? │?? └── tlsca.org1.example.com-cert.pem
│?? └── tls*存放tls相關的證書和私鑰
│?? ├── ca.crt*組織的根證書
│?? ├── server.crt*管理員的用戶身份驗證證書,被組織根證書簽名
│?? └── server.key*管理員用戶的身份私鑰,用來簽名
└── User1@org1.example.com
├── msp
│?? ├── admincerts
│?? │?? └── User1@org1.example.com-cert.pem
│?? ├── cacerts
│?? │?? └── ca.org1.example.com-cert.pem
│?? ├── keystore
│?? │?? └── c75bd6911aca808941c3557ee7c97e90f3952e379497dc55eb903f31b50abc83_sk
│?? ├── signcerts
│?? │?? └── User1@org1.example.com-cert.pem
│?? └── tlscacerts
│?? └── tlsca.org1.example.com-cert.pem
└── tls
├── ca.crt
├── server.crt
└── server.key
```
以 `org1.example.com`目錄下來解析:
* ca
* msp
* peers
* tlsca
* users
##### **6.1 目錄-ca 存放組織的根證書和對應的私鑰文件**
* ca :存放組織的根證書和對應的私鑰文件,默認采用 EC 算法,證書為自簽名
##### **6.2 目錄-msp 存放代表該組織的身份信息**
* admincerts :組織管理員的身份驗證證書,被根證書簽名
* cacerts :組織的根證書,同 ca 目錄下文件
* tlscacerts :用于 TLS 的 CA 證書,自簽名
##### **6.2 目錄-peers 存放屬于該組織的所有 Peer 節點**
* peer0.org1.example.com:第一個 peer 的信息,包括其 msp 證書和 tls 證書兩類
* msp:
* admincerts :組織管理員的身份驗證證書 。 Peer 將基于這些證書來認證交易簽署者是否為管理員身份
* cacert貯存放組織的根證書 。
* key store :本節點的身份私鑰,用來簽名 。
* signce白: 驗證本節點簽名的證書,被組織根證書簽名 。
* tlscacerts : TLS 連接用的身份證書,即組織 TLS 證書 。
* is :存放 tis 相關的證書和私鑰
* a.crt :組織的根證書 。
。 server.crt :驗證本節點簽名的證書,被組織根證書簽名 。
。 server.key : 本節點的身份私鑰,用來簽名 。
? peerl :第二個 peer 的信息,結構類似 。 (此處省略。 )
口 users :存放屬于該組織的用戶的實體 。
? Admin :管理員用戶的信息,包括其 msp 證書和 tis 證書兩類 。
? msp:
。 admincerts :管理身份驗證證書 。
。 cacerts :存放組織的根證書 。
。 key store :本用戶的身份私鑰,用來簽名 。
。 signcerts :管理員用戶的身份驗證證書,被組織根證書簽名 。 要被某個 Peer
認可,則必須放到該 Peer 的 msp/admincerts 下 。
。 tlscacerts: TLS 連接用的身份證書,即組織 TLS 證書 。
? tis :存放 tis 相關的證書和私鑰 。
。 ca .crt :組織的根證書 。
。 server.crt : 管理員的用戶身份驗證證書,被組織根證書簽名 。
。 server.key :管理員用戶的身份私鑰,用來簽名。
? Userl :第一個用戶的信息,包括 msp 證書和 tis 證書兩類。
? msp:
。 admincerts : 管理身份驗證證書 。
。 cacerts :存放組織的根證書 。
198 令實踐篇
。 keys tore :本用戶的身份私鑰,用來簽名 。
。 sign certs :驗證本用戶簽名的身份證書,被組織根證書簽名 。
。 tlscacerts: TLS 連接用的身份證書,即組織 TLS 證書 。
? tls :存放 tls 相關的證書和私鑰 。
。 ca.crt :組織的根證書 。
。 se凹er.crt :驗證用戶簽名的身份證書,被組織根證書簽名 。
。 server.key :用戶的身份私鑰,用來簽名 。
? User2 :第二個用戶的信息,結構類似 。 (此處省略。 )