Hyperledger-Fabric源碼分析(MSP-證書生成)

MSP的主要的任務(wù)是運(yùn)用手中的證書來做身份和權(quán)限控制。在Fabric中證書的生成可以通過cryptogen來生成,基本上這是一種靜態(tài)工具,玩玩demo是可以的,不建議在生產(chǎn)環(huán)境下使用,官方推薦用Fabric-ca。不過沒關(guān)系,內(nèi)部邏輯都類似。

20180413180640626.JPG

配置文件

OrdererOrgs:
  - Name: Orderer
    Domain: example.com
    Specs:
      - Hostname: orderer
PeerOrgs:
  - Name: Org1
    Domain: org1.example.com
    Template:
      Count: 1
    Users:
      Count: 1

  • 基本上這個配置很簡單,one orderer,one org,one peer from org,one user。

生成結(jié)構(gòu)

  • 生成的文件分兩部分,peer和orderer。如下圖所示。

  • 初看上面生成的文件有點(diǎn)懵,沒關(guān)系,下面我們以peer為例,來分析下,這些是怎么來的。

peer

1554305990325.png

orderer

1554306053688.png

cryptogen

peerOrganizations/org1.example.com

ca

func NewCA(baseDir, org, name, country, province, locality, orgUnit, streetAddress, postalCode string) (*CA, error) {

   var response error
   var ca *CA

   err := os.MkdirAll(baseDir, 0755)
   if err == nil {
      priv, signer, err := csp.GeneratePrivateKey(baseDir)
      response = err
      if err == nil {
         // get public signing certificate
         ecPubKey, err := csp.GetECPublicKey(priv)
         response = err
         if err == nil {
            template := x509Template()
            //this is a CA
            template.IsCA = true
            template.KeyUsage |= x509.KeyUsageDigitalSignature |
               x509.KeyUsageKeyEncipherment | x509.KeyUsageCertSign |
               x509.KeyUsageCRLSign
            template.ExtKeyUsage = []x509.ExtKeyUsage{
               x509.ExtKeyUsageClientAuth,
               x509.ExtKeyUsageServerAuth,
            }

            //set the organization for the subject
            subject := subjectTemplateAdditional(country, province, locality, orgUnit, streetAddress, postalCode)
            subject.Organization = []string{org}
            subject.CommonName = name

            template.Subject = subject
            template.SubjectKeyId = priv.SKI()

            x509Cert, err := genCertificateECDSA(baseDir, name, &template, &template,
               ecPubKey, signer)
            response = err
            if err == nil {
               ca = &CA{
                  Name:               name,
                  Signer:             signer,
                  SignCert:           x509Cert,
                  Country:            country,
                  Province:           province,
                  Locality:           locality,
                  OrganizationalUnit: orgUnit,
                  StreetAddress:      streetAddress,
                  PostalCode:         postalCode,
               }
            }
         }
      }
   }
   return ca, response
}
  • 生成橢圓曲線公私鑰對fe85445ac723e6c3c16084dc6f4bec0f17ef2e92fb255bbb00e9822772f3127e_sk
  • 有興趣可以去看看genCertificateECDSA,如果template和parent相同,說明生成的是自簽名(self-signed)的證書。
  • 還有SKI是取得私鑰的摘要
  • 注意證書里面的CommonName和Organization,多說無益,直接看證書內(nèi)容就好。
1554308756382.png
1554307718914.png

tlsca

跟ca同理,這里只展示證書內(nèi)容,同樣要注意證書里面的CommonName和Organization

1554307878009.png

msp

admincerts

跟下面Admin@org1.example.com的證書保持一致

1554311752052.png

cacerts

err = x509Export(filepath.Join(baseDir, "cacerts", x509Filename(signCA.Name)), signCA.SignCert)

其實(shí)就是將ca的證書導(dǎo)出到這個目錄

1554308194374.png

tlscacerts

err = x509Export(filepath.Join(baseDir, "tlscacerts", x509Filename(tlsCA.Name)), tlsCA.SignCert)

同理將tlsca的證書導(dǎo)出到這個目錄

1554308340854.png

peers

peer0.org1.example.com

msp
admincerts

跟下面Admin@org1.example.com的證書保持一致

1554311752052.png
keystore
priv, _, err := csp.GeneratePrivateKey(keystore)

再次生成公私鑰對,可以看到跟之前完全不一樣,全新的一對

1554309034404.png
signcerts
cert, err := signCA.SignCertificate(filepath.Join(mspDir, "signcerts"),
   name, ous, nil, ecPubKey, x509.KeyUsageDigitalSignature, []x509.ExtKeyUsage{})

第一次看來由ca來簽發(fā)證書。直接來看證書內(nèi)容。

  • 怎么體現(xiàn)是由ca來簽發(fā)的?AKI,也就是Authority Key Identifier??梢匀ド厦娴腸a證書的SKI去比對。兩者是要嚴(yán)格一致的。
  • 證書的其中一個功能是對外宣告,我包含的公鑰是合法的,放心用,可以看到這里包含的公鑰就是之前生成的。意味著數(shù)字簽名會用keystore的私鑰,讓其他人用證書里面的公鑰來驗(yàn)證。
1554309256158.png
cacerts

跟之前的處理一樣,這里也是ca的冗余

tlscacerts

跟之前的處理一樣,這里也是tlsca的冗余

tls
ca.crt

這里是tlsca的冗余,可以自行去比較,跟前面的tlsca完全一致

server.key

這里是針對tls重新生成的一對公私鑰,意味著要用tlsca簽發(fā)tls使用的證書。

1554310326178.png
server.crt
1554310369592.png

users

User1@org1.example.com

msp
admincerts

跟下面Admin@org1.example.com的證書保持一致

1554311752052.png
keystore

同上

1554310865758.png
signcerts

同上

1554310832186.png
cacerts

同上

tlscacerts

同上

tls
ca.crt

同上

client.key

同上

1554310981694.png
client.crt

同上

1554311012410.png

Admin@org1.example.com

msp
keystore

同上

1554311480554.png
admincerts

注意這里跟signcerts的一致,也是整體admin的證書

1554311367214.png
signcerts

同上

1554311574420.png
cacerts

同上

tlscacerts

同上

tls
ca.crt

同上

client.key

同上

1554311627359.png
client.crt

同上

1554311652573.png

總結(jié)

講這么多,還不如畫張圖來的清楚
當(dāng)時(shí)看的時(shí)候漏了,admincert是從User的signcert來,然后擴(kuò)散的。


Untitled Diagram.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容