由于官方例程無法滿足我們的項(xiàng)目需要壤追,所以在Fabric1.4提供的BYFN的例程基礎(chǔ)之上哟忍,按照項(xiàng)目需要修改相關(guān)證書。
一. 修改證書里面的相關(guān)配置字段
首先需要修改證書里面關(guān)于國家近顷、省市等一些基礎(chǔ)信息遂赠,下面兩張圖片表示修改前后的對比:
為實(shí)現(xiàn)上述修改,需要修改配置文件crypto-config.yaml脉让,增加內(nèi)容如下圖所示:
在原配置文件中桂敛,并沒有指定CA關(guān)于CSR字段的相關(guān)內(nèi)容,閱讀源碼可知溅潜,其CSR相關(guān)字段采用缺省值术唬。如果在crypto-config.yaml中指定了CSR字段的相關(guān)內(nèi)容,則使用配置文件中的內(nèi)容伟恶。
修改后的效果如前面截圖所示碴开。
配置文件一共需要修改三處,Order節(jié)點(diǎn)博秫、Peer節(jié)點(diǎn)的Org1和Org2潦牛。
Order節(jié)點(diǎn)只需增加三項(xiàng):Country、Province挡育、Locality巴碗,分別代表國家、省即寒、市橡淆。
在修改Peer節(jié)點(diǎn)的Org1和Org2時召噩,在上面修改的基礎(chǔ)上,還增加了StreetAddress選項(xiàng)逸爵,臨時充當(dāng)一個自定義選項(xiàng)具滴,來區(qū)分鑄幣行、清算行等师倔。
以后若項(xiàng)目需要构韵,可研究如何增加擴(kuò)展選項(xiàng)。
二. 修改注意事項(xiàng)
本章節(jié)介紹在修改配置文件時趋艘,遇到的幾個問題疲恢。
2.1 使用OU
曾經(jīng)想使用OU選項(xiàng)作為自定義項(xiàng),但發(fā)現(xiàn)Peer節(jié)點(diǎn)已使用了OU選項(xiàng)瓷胧,來區(qū)分是Peer還是Client显拳。如果強(qiáng)行在crypto-config.yaml指定了OU,則證書中會出現(xiàn)兩個OU搓萧。
本人曾經(jīng)試圖把EnableNodeOUs關(guān)掉杂数,這樣就不會出現(xiàn)2個OU,同時也可以正常生成證書矛绘,但是無法通過后續(xù)的byfn(build your first network)的測試耍休。
因?yàn)槿绻O(shè)置了EnableNodeOUs,就在msp目錄下生成config.yaml文件货矮。如果把EnableNodeOUs關(guān)掉羊精,會讓生成的證書不全,導(dǎo)致不能通過后續(xù)測試囚玫。
2.2 注意縮進(jìn)的格式
在修改配置文件時喧锦,必須用空格縮進(jìn),不要使用TAB鍵抓督,否則會導(dǎo)致解析腳本文件出錯燃少。
在最初修改時,由于沒有注意這個細(xì)節(jié)铃在,導(dǎo)致有時配置文件可修改成功阵具,有時不行。后來仔細(xì)閱讀出錯的提示定铜,才發(fā)現(xiàn)此原因阳液。
2.3 修改配置文件的作用范圍
在配置文件config.yaml中修改了CSR相關(guān)字段后,會同時影響頒發(fā)者(Issuer Name)和使用者(Subject Name)的相關(guān)字段揣炕。
在實(shí)際應(yīng)用過程中帘皿,頒發(fā)者和使用者的相關(guān)字段是不同的畸陡,此處為簡化處理虽填。
三. 證書和公私鑰簡介
本章節(jié)介紹證書和公私鑰的相關(guān)概念斋日。
證書代表身份桑驱,用來在實(shí)體間進(jìn)行通信以及交易的時候進(jìn)行簽名與驗(yàn)證身份。
查看證書文件(數(shù)字證書是經(jīng)過CA認(rèn)證過的公鑰)的標(biāo)準(zhǔn)為X.509赊级,編碼格式為pem理逊,以-----BEGIN開頭晋被,以-----END結(jié)尾刚盈。
X.509數(shù)字證書不但包括用戶名和公共密鑰藕漱,而且還包括有關(guān)該用戶的其它信息。數(shù)字證書除了擴(kuò)展名為PEM威蕉,也可以是CRT橄仍、KEY侮繁。
CRT:Certificate縮寫,PEM編碼格式舀奶。
KEY:用來存放一個公鑰或私鑰育勺,并非X.509證書涧至,PEM格式南蓬。
證書的默認(rèn)簽名算法為ECDSA赘方,Hash算法為SHA-256窄陡。
Fabric中涉及了以下類型證書:
登記證書(ECert):頒發(fā)給提供了注冊憑證的用戶或節(jié)點(diǎn)實(shí)體跳夭,長期有效。(主要就是通ECert對實(shí)體身份檢驗(yàn))
通信證書(TLSCert):TLS證書用來保障通信鏈路安全润歉,控制對網(wǎng)絡(luò)層的接入訪問,可以對遠(yuǎn)端實(shí)體身份校驗(yàn)颈抚,防止竊聽踩衩。
在ChainCode里可以通過shim API的GetCreator函數(shù)提取調(diào)用當(dāng)前交易的客戶端的證書邪意,使用GO語言的pem包將證書解碼九妈,然后使用x.509包解析證書中的信息雾鬼。
四. 生成證書和公私鑰的過程
4.1 生成節(jié)點(diǎn)的CA證書萌朱。
創(chuàng)建 crypto-config/peerOrganizations/{domain}/ca 目錄策菜,例子中為org.example.com晶疼。根據(jù)yaml:CA的配置,使用fabric的加密服務(wù)提供程序(bccsp)翠霍,生成P256的橢圓加密算法的私鑰和公鑰,然后使用ca中指定的 country, province寒匙,common name等信息生成包含公鑰信息的ca.org2.example.com-cert.pem 文件。
4.2 生成tls的證書会宪。
同上面的ca證書,只不過tls證書中的common name為 tlsca, 而上面的ca證書中的common name為ca塞帐。
4.3 導(dǎo)入到MSP
把ca下的證書和tls證書導(dǎo)入到crypto-config/peerOrganizations/org2.example.com/msp/cacerts和crypto-config/peerOrganizations/org2.example.com/msp/tlscacerts下
4.4 生成配置文件
如果設(shè)置了EnableNodeOUs葵姥,就在msp目錄下生成config.yaml文件?
4.5 創(chuàng)建本地msp
根據(jù)配置的節(jié)點(diǎn)信息,為每一個節(jié)點(diǎn)創(chuàng)建本地的msp,?包括兩部分:
第一部分為創(chuàng)建peers/{commonName}/msp?句携。具體為:
peers/peer0.org2.example.com/msp 和
peers/peer1.org2.example.com/msp
這部分證書都是通過CSP(Cryptographic Service Provider:加密服務(wù)提供者)?產(chǎn)生一個keystore私鑰牌里,然后使用這個私鑰對應(yīng)的公鑰生成admincerts,cacerts务甥,signcerts?的證書。而cacerts下的證書和peerOrganizations/{domain}/ca下ca.{domain}-cert.pem是完全一樣的喳篇。tlscacerts?下的證書也和{domain}下其他的tlscacerts文件夾下的證書完全一致敞临。
第二部分是生成peers/{commonName}/tls目錄下的公私鑰證書,具體為:peers/peer0.org2.example.com/tls
peers/peer1.org2.example.com/tls
這部分證書是重新生成的麸澜。包含一個ca證書挺尿,一個公鑰證書和一個私鑰證書。如果節(jié)點(diǎn)類型為?client炊邦,就生成客戶端的公鑰證書和私鑰證書编矾,如果節(jié)點(diǎn)類型為orderer或是peer類型,就生成服務(wù)端相關(guān)的證書馁害。
私鑰存在serer.key內(nèi)窄俏。ca.crt是把證書內(nèi)容通過x509.ParseCertificate轉(zhuǎn)換得到,而server.crt是通過把寫入了證書內(nèi)容的pem文件直接重命名成crt文件得到碘菜。
4.6 生成用戶證書
根據(jù)配置的yaml:Users下的yaml:Count 的數(shù)目凹蜈,來為每個用戶生成用戶信息,生成的內(nèi)容和步驟和上一節(jié)完全一致忍啸。
用戶名的生成規(guī)則為:從1開始循環(huán)遞增到Count, 每個用戶名為:"User" + index + @ + Domain , 例子中就為:User1@org2.example.com仰坦。默認(rèn)會有一個admin用戶。
4.7 復(fù)制管理員證書
把user目錄下的signcerts 作為admincerts copy到org1.example.com/msp/admincerts和org1.example.com/peers/{CommonName}/admincerts下计雌。
到此悄晃,節(jié)點(diǎn)相關(guān)的所有證書信息已經(jīng)生成。
生成orderer相關(guān)的證書信息凿滤,過程和節(jié)點(diǎn)完全類似的妈橄。
五. 證書的結(jié)構(gòu)
5.1 組織的證書結(jié)構(gòu)
每個組織都會生成單獨(dú)的根證書庶近。相關(guān)的子目錄有5個(可在Ubuntu中安裝Dolphin文件管理器以顯示目錄樹),如下圖所示:
(1)ca
ca目錄存放組織的根證書和對應(yīng)的私鑰文件眷细,采用EC算法拦盹,證書為自簽名(自已簽發(fā)自己的公鑰)。組織內(nèi)的實(shí)體將基于該證書作為根證書溪椎。
(2)msp
msp目錄存放代表該組織的身份信息普舆。
A、admincerts:存放被根證書簽名的組織管理員的身份驗(yàn)證證書校读。
B沼侣、cacerts:存放組織的根證書,與ca目錄下的根證書文件相同歉秫。
C蛾洛、tlscacerts:用于TLS的ca證數(shù),證書為自簽名雁芙。
(3)peers(orders)
每個Orderer或Peer節(jié)點(diǎn)的證書結(jié)構(gòu)都是相同的轧膘,包括msp和tls目錄。
(4)tlsca
存放組織的TLS證書兔甘。
(5)users
用于存放屬于該組織的用戶實(shí)體谎碍。
5.2 Peer節(jié)點(diǎn)的證書結(jié)構(gòu)
每個Orderer或Peer節(jié)點(diǎn)的證書結(jié)構(gòu)都是相同的,包括msp和tls目錄洞焙。
(1)msp
admincerts:存放組織管理員的身份驗(yàn)證證書蟆淀,用于驗(yàn)證交易簽名者是否為管理員身份。
cacerts:存放組織的根證書澡匪。
keystore:本節(jié)點(diǎn)的身份私鑰熔任,用來簽名。
signcerts:驗(yàn)證本節(jié)點(diǎn)簽名的證書唁情,被組織根證書簽名疑苔。
tlscacerts:TLS連接用的證書,即組織的TLS證書荠瘪。
(2)tls
存放tls相關(guān)的證書和私鑰夯巷。
ca.crt:組織的根證書。
server.crt:驗(yàn)證本節(jié)點(diǎn)簽名的證書哀墓,被組織根證書簽名趁餐。
server.key:本節(jié)點(diǎn)的身份私鑰,用來簽名篮绰。
5.3 用戶實(shí)體的證書結(jié)構(gòu)
5.3.1 Admin@org1.example.com
存放管理員用戶的信息后雷,包括msp目錄和tls目錄
(A)msp
admincerts:存放管理員證書(Admin@org1.example.com-cert.pem)
cacerts:存放組織的根證書(ca.org1.example.com-cert.pem)
keystore:存放本用戶的身份私鑰,用來簽名
signcerts:存放管理員用戶的身份驗(yàn)證證書(Admin@org1.example.com-cert.pem),由組織根證書簽名臀突,要放到Peer節(jié)點(diǎn)的msp/admincerts下才會被Peer節(jié)點(diǎn)認(rèn)可
tlscacerts:TLS連接用的證書勉抓,即組織TLS證書(tlsca.org1.example.com-cert.pem)
(B)tls
ca.crt:組織的根證書
client.crt: 管理員用戶的身份驗(yàn)證證書,由組織根證書簽名
client.key:管理員的身份私鑰候学,用來簽名
5.3.2 User1@org1.example.com
User1是User1用戶的信息藕筋,包括msp證書和tls證書
(A)msp
admincerts:用戶證書(User1@org1.example.com-cert.pem)
cacerts:存放組織的根證書(ca.org1.example.com-cert.pem)
keystore:本用戶的身份私鑰,用來簽名
signcerts:用戶的身份驗(yàn)證證書(User1@org1.example.com-cert.pem)梳码,由組織根證書簽名
tlscacerts:TLS連接用的證書隐圾,即組織TLS證書(tlsca.org1.example.com-cert.pem)
(B)tls
ca.crt:組織的根證書。
client.crt: 用戶的身份驗(yàn)證證書掰茶,由組織根證書簽名暇藏。
client.key:用戶身份私鑰,用來簽名濒蒋。