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

2019-04-04  本文已影响0人  Pillar_Zhong

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

跟下面Admin@org1.example.com的证书保持一致

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

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

  • 怎么体现是由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

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

总结

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


Untitled Diagram.png
上一篇下一篇

猜你喜欢

热点阅读