Hyperledger-Fabric源码分析(MSP-证书生成)

MSP的主要的任务是运用手中的证书来做身份和权限控制。在Fabric中证书的生成可以通过cryptogen来生成,基本上这是一种静态工具,玩玩demo是可以的,不建议在生产环境下使用,官方推荐用Fabric-ca。不过没关系,内部逻辑都类似。

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。

生成结构

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

  • 初看上面生成的文件有点懵,没关系,下面我们以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,多说无益,直接看证书内容就好。
1554308756382.png
1554307718914.png

tlsca

跟ca同理,这里只展示证书内容,同样要注意证书里面的CommonName和Organization

1554307878009.png

msp

admincerts

跟下面[email protected]的证书保持一致

1554311752052.png

cacerts

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

其实就是将ca的证书导出到这个目录

1554308194374.png

tlscacerts

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

同理将tlsca的证书导出到这个目录

1554308340854.png

peers

peer0.org1.example.com

msp
admincerts

跟下面[email protected]的证书保持一致

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来签发证书。直接来看证书内容。

  • 怎么体现是由ca来签发的?AKI,也就是Authority Key Identifier。可以去上面的ca证书的SKI去比对。两者是要严格一致的。
  • 证书的其中一个功能是对外宣告,我包含的公钥是合法的,放心用,可以看到这里包含的公钥就是之前生成的。意味着数字签名会用keystore的私钥,让其他人用证书里面的公钥来验证。
1554309256158.png
cacerts

跟之前的处理一样,这里也是ca的冗余

tlscacerts

跟之前的处理一样,这里也是tlsca的冗余

tls
ca.crt

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

server.key

这里是针对tls重新生成的一对公私钥,意味着要用tlsca签发tls使用的证书。

1554310326178.png
server.crt
1554310369592.png

users

[email protected]

msp
admincerts

跟下面[email protected]的证书保持一致

1554311752052.png
keystore

同上

1554310865758.png
signcerts

同上

1554310832186.png
cacerts

同上

tlscacerts

同上

tls
ca.crt

同上

client.key

同上

1554310981694.png
client.crt

同上

1554311012410.png

[email protected]

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

总结

讲这么多,还不如画张图来的清楚
当时看的时候漏了,admincert是从User的signcert来,然后扩散的。


Untitled Diagram.png

你可能感兴趣的:(Hyperledger-Fabric源码分析(MSP-证书生成))