Hyperledger Fabric提供了一個用開生成相關(guān)證書的模塊不狮,叫做cryptogen姜钳。這個工具會根據(jù)用戶指定的配置文件生成相關(guān)的證書
在使用cryptogen生成證書之前柳骄,我們首先要了解Fabric的架構(gòu)和管理邏輯饲帅。從高層次來說,F(xiàn)abric的參與者被稱為組織Org耍休,所有組織會共同維護(hù)一個用來排序節(jié)點(diǎn)的集群稱為orderer,各個組織內(nèi)部會維護(hù)若干臺peer節(jié)點(diǎn)货矮,用于接受客戶端請求和記賬羊精。
除此之外,每類節(jié)點(diǎn)都可以包含若干用戶囚玫,必須有一個Admin用戶喧锦,每個節(jié)點(diǎn)和用戶
在通信時,節(jié)點(diǎn)之間可以設(shè)置通過TLS加密抓督,這就需要TLS的證書燃少,因此Fabric的證書分為兩類MSP和TLS。
Orderer類型
- 聯(lián)盟(這里稱為聯(lián)盟是因?yàn)镺rderer由多個組織合作共同維護(hù)的排序節(jié)點(diǎn)集群铃在,便于理解)
Peer類型
- 組織1
- 組織2
- 組織3
- peer節(jié)點(diǎn)
- peer0節(jié)點(diǎn)
- peer1節(jié)點(diǎn)
- msp
- tls
- 用戶
- Admin
- User1
- msp
- tls
生成證書
配置文件
cryptogen提供了下面的命令阵具,用來生成配置模板
cryptogen showtemplate
修改配置文件為下面的內(nèi)容,其中指定了Order類型的聯(lián)盟名稱jianshu.com
定铜,Peer類型指定了有兩個組織阳液,分別為org1.jianshu.com
和org2.jianshu.com
,兩個組織分別有2個peer節(jié)點(diǎn)和3/2個用戶。
OrdererOrgs:
- Name: Orderer
Domain: jianshu.com
Specs:
- Hostname: orderer
Template:
Count: 2
PeerOrgs:
- Name: Org1
Domain: org1.jianshu.com
Template:
Count: 2
Users:
Count: 3
- Name: Org2
Domain: org2.jianshu.com
Template:
Count: 2
Users:
Count: 2
生成證書
使用下面的命令可以根據(jù)配置文件生成證書文件
cryptogen generate --config=crypto-config.yaml --output ./crypto-config
證書結(jié)構(gòu)
進(jìn)入crypto-config
文件夾宿稀,使用tree -L 2
可以查看目錄的結(jié)構(gòu)
├── ordererOrganizations
│ └── jianshu.com
│ ├── ca
│ ├── msp
│ ├── orderers
│ ├── tlsca
│ └── users
└── peerOrganizations
├── org1.jianshu.com
│ ├── ca
│ ├── msp
│ ├── peers
│ ├── tlsca
│ └── users
└── org2.jianshu.com
├── ca
├── msp
├── peers
├── tlsca
└── users
從上面的結(jié)構(gòu)來說趁舀,內(nèi)部主要根據(jù)節(jié)點(diǎn)類型來劃分,Orderer類型保護(hù)一個聯(lián)盟祝沸,Peer類型有兩個組織矮烹。
證書詳解
由于Orderer類型的聯(lián)盟和Peer類型的組織內(nèi)的證書結(jié)構(gòu)是一樣的,我們org1.jianshu.com
為例罩锐,了解其內(nèi)部的結(jié)構(gòu)奉狈。首先,使用tree命令打印出這個文件夾下的內(nèi)容涩惑,-L后面的數(shù)字可以調(diào)整層次仁期。
├── org1.jianshu.com
│ ├── ca
│ │ ├── ca.org1.jianshu.com-cert.pem
│ │ └── 965e1493f4_sk
│ ├── tlsca
│ │ ├── 2312a9c0380eb48d343_sk
│ │ └── tlsca.org1.jianshu.com-cert.pem
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ └── tlscacerts
│ ├── peers
│ │ ├── peer0.org1.jianshu.com
│ │ └── peer1.org1.jianshu.com
│ └── users
│ ├── Admin@org1.jianshu.com
│ ├── User1@org1.jianshu.com
│ ├── User2@org1.jianshu.com
│ └── User3@org1.jianshu.com
- 對于一個組織來說,其有兩類根證書,一類是用戶根證書跛蛋,一類是用來TLS通信的根證書熬的,分別在
ca
和tlsca
文件夾內(nèi)部。 - msp文件夾是組織的身份文件赊级,內(nèi)部包含了Admin證書
admincerts
押框,組織根證書cacerts
和tls的根證書tlscacerts
- peers中包含了組織
org1.jianshu.com
各個peer節(jié)點(diǎn)的相關(guān)認(rèn)證文件 - users中包含了組織
org2.jianshu.com
各個用戶的相關(guān)認(rèn)證文件
ca和tlsca
下面我們以ca
為例,驗(yàn)證一下根證書理逊。ca
內(nèi)部以_sk結(jié)尾的是組織org1.jianshu.com
的私鑰橡伞,pem是組織org1.jianshu.com
的自簽名根證書。
查看根證書信息
openssl x509 -in root.crt -text | less
驗(yàn)證證書與私鑰匹配
下面是一個驗(yàn)證腳本晋被,參數(shù)1是證書兑徘,參數(shù)2是私鑰,保存為certcheck.sh
羡洛,修改權(quán)限后可以執(zhí)行
#!/bin/bash
if [[ "$1" = "" || "$2" = "" ]]; then
echo "certCheck.sh certfile keyfile"
exit 0;
else
#certModuleMd5=`openssl x509 -noout -modulus -in $1 | openssl md5`
#privateModuleMd5=`openssl rsa -noout -modulus -in $2 | openssl md5`
#if [ "$certModuleMd5" = "$privateModuleMd5" ] ; then
# echo "ok"
#else
# echo "not ok"
#fi
value=`openssl x509 -text -noout -in $1 | grep "Public Key Algorithm:" | awk -F ':' 'BEGIN {} {print $2} END {}'`
if [ "$value" = " rsaEncryption" ] ; then
echo $value
requestModuleMd5=`openssl x509 -modulus -in $1 | grep Modulus | openssl md5`
privateModuleMd5=`openssl rsa -noout -modulus -in $2 | openssl md5`
else
`openssl ec -in $2 -pubout -out ecpubkey.pem `
privateModuleMd5=`cat ecpubkey.pem | openssl md5`
requestModuleMd5=`openssl x509 -in $1 -pubkey -noout | openssl md5`
fi
if [ "$requestModuleMd5" = "$privateModuleMd5" ] ; then
echo "ok"
fi
fi
執(zhí)行下面命令挂脑,輸出ok
說明私鑰和證書是匹配的
./certcheck.sh peerOrganizations/org1.jianshu.com/ca/ca.org1.jianshu.com-cert.pem peerOrganizations/org1.jianshu.com/ca/fab24049c802a9bfcd056753c1175fe369f728c531315f106aeb11965e1493f4_sk
read EC key
writing EC key
ok
msp文件夾
msp文件夾中分別保存了組織org1.jianshu.com
的相關(guān)根證書
├── msp
│ ├── admincerts [Admin用戶的證書]
│ │ └── Admin@org1.jianshu.com-cert.pem
│ ├── cacerts [ca的根證書]
│ │ └── ca.org1.jianshu.com-cert.pem
│ └── tlscacerts [tlsca的根證書]
│ └── tlsca.org1.jianshu.com-cert.pem
ca.org1.jianshu.com-cert.pem與tlsca.org1.jianshu.com-cert.pem分別與ca
和tlsca
下的同名文件內(nèi)容一樣, 可以通過md5sum命令查看翘县。
# ca下
md5sum ca/ca.org1.jianshu.com-cert.pem
00067a1e3e1ec302e7c3e66433bc73ed ca/ca.org1.jianshu.com-cert.pem
# msp/cacerts下
md5sum msp/cacerts/ca.org1.jianshu.com-cert.pem
00067a1e3e1ec302e7c3e66433bc73ed msp/cacerts/ca.org1.jianshu.com-cert.pem
至于admincerts的Admin@org1.jianshu.com-cert.pem
文件也是Admin用戶的證書最域,與Admin@org1.jianshu.com里面的證書一樣。
peers文件夾
peers文件夾內(nèi)有兩個peer節(jié)點(diǎn)锈麸,分別是peer0.org1.jianshu.com
和peer1.org1.jianshu.com
,先以peer0
為例說內(nèi)部的結(jié)構(gòu)
├── peer0.org1.jianshu.com
│ ├── msp
│ │ ├── admincerts [組織Org1的Admin用戶證書]
│ │ │ └── Admin@org1.jianshu.com-cert.pem
│ │ ├── cacerts [組織Org1的CA根證書]
│ │ │ └── ca.org1.jianshu.com-cert.pem
│ │ ├── keystore [組織Org1的peer0節(jié)點(diǎn)的證書的私鑰]
│ │ │ └── eba279fe94e117473da7eee00_sk
│ │ ├── signcerts [組織Org1的peer0節(jié)點(diǎn)的證書牺蹄,由組織Org1的CA根證書簽發(fā)]
│ │ │ └── peer0.org1.jianshu.com-cert.pem
│ │ └── tlscacerts [組織Org1的tls的根證書]
│ │ └── tlsca.org1.jianshu.com-cert.pem
│ └── tls
│ ├── ca.crt [組織Org1的tls的根證書忘伞,與tlscacerts下的一樣]
│ ├── server.crt [由組織Org1的tls的根證書簽發(fā)的用于tls通信的證書]
│ └── server.key [由組織Org1的tls的根證書簽發(fā)的用于tls通信的證書的私鑰]
- 在上面的結(jié)構(gòu)中,
signcerts
是peer節(jié)點(diǎn)peer0
的證書沙兰,keystore
是與這個證書對應(yīng)的私鑰;具體可以使用之前的腳本進(jìn)行驗(yàn)證 - 其他都是
peer0
所屬的組織Org1的相關(guān)證書氓奈。 - tls文件夾下是
peer0
進(jìn)行tls通信時使用的證書server.crt
和私鑰server.key
,而ca.crt
是組織Org1的tls根證書
users文件夾
users文件夾內(nèi)部結(jié)構(gòu)與peers文件夾一致,主要包含了每個用戶的msp證書和私鑰鼎天,tls通信使用的證書和私鑰舀奶。
每個組織都有自己的msp根證書和tls根證書,每個組織都包含若干的peer節(jié)點(diǎn)和user用戶斋射,他們自己的證書都是通過相對應(yīng)類型的根證書簽發(fā)的育勺。而且,從文件夾的結(jié)構(gòu)罗岖,我們也可以看出涧至,每個證書都可以從文件名稱看出是何種證書。
在下一節(jié)中桑包,我們將會啟動Fabric-CA的服務(wù)器南蓬,并將其綁定到組織org1.jianshu.com
上,由其來動態(tài)簽發(fā)證書。