美文网首页
Hyperledger-Fabric源码分析(MSP-证书生成)

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

作者: Pillar_Zhong | 来源:发表于2019-04-04 10:04 被阅读0次

    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

    相关文章

      网友评论

          本文标题:Hyperledger-Fabric源码分析(MSP-证书生成)

          本文链接:https://www.haomeiwen.com/subject/uszxiqtx.html