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

MSP的主要的任務(wù)是運用手中的證書來做身份和權(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。如下圖所示。

  • 初看上面生成的文件有點懵,沒關(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)

其實就是將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。可以去上面的ca證書的SKI去比對。兩者是要嚴格一致的。
  • 證書的其中一個功能是對外宣告,我包含的公鑰是合法的,放心用,可以看到這里包含的公鑰就是之前生成的。意味著數(shù)字簽名會用keystore的私鑰,讓其他人用證書里面的公鑰來驗證。
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é)

講這么多,還不如畫張圖來的清楚
當時看的時候漏了,admincert是從User的signcert來,然后擴散的。


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

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

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