蝸牛講-fabric原理之證書生成



 

蝸牛講技術,滿滿的都是干貨,你值得關注。


 

之前我們講了通過

./byfn.sh  generate

的作用是 用於生成fabric網絡中的組件公私鑰證書信息以及初始的交易信息。如果只是要生成相關證書信息,也可以直接使用fabric提供的cryptogen 工具完成這一步工作,命令如下:

cryptogen generate --config=./crypto-config.yaml

具體是怎么生成的,由crypto-config.yaml配置文件決定。我們將詳細介紹是如何產生證書文件,已經生成了哪些證書文件。

 

讀取crypto-config.yaml配置信息

 

cryptogen工具會讀取 crypto-config.yaml中的所有配置,把內容解析到名為 OrdererOrgs和 PeerOrgs的數據結構中,其實這兩個對應的就是crypto-config.yaml 中的兩個根節點或是一級節點(這里是把yaml看成和xml一樣的文件格式),這兩個的類型為OrgSpec,類型的定義如下:

type OrgSpec struct {
   Name          string       `yaml:"Name"`
   Domain        string       `yaml:"Domain"`
   EnableNodeOUs bool         `yaml:"EnableNodeOUs"`
   CA            NodeSpec     `yaml:"CA"`
   Template      NodeTemplate `yaml:"Template"`
   Specs         []NodeSpec   `yaml:"Specs"`
   Users         UsersSpec    `yaml:"Users"`
}

這里也可以看出OrdererOrgs和 PeerOrgs是由哪些子節點組成的(這里說的節點是 文件內容里的標簽節點,而不是fabric里所的網絡節點)

 

解析PeerOrgs

 

假如當前的一個PeerOrgs配置如下:

  - Name: Org2
   Domain: org2.example.com
   EnableNodeOUs: true
   Template:
     Count: 2
   Users:
     Count: 1
  • 根據Template的count數量(這個count決定了這個org2.example.com的域名下有多少個節點),生成相應數量的hostname, 並把 這些hostname信息放在specs下,可以看成會生成如下格式,以yaml文件格式表示:

      - Name: Org2
       Domain: org2.example.com
       EnableNodeOUs: true
       Template:
         Count: 2
       Users:
         Count: 1
      Specs:
         -Hostname:peer0
         -Hostname:peer1
  •  處理yaml:Specs節點的配置

    1. 首先會根據提供的模板

    "{{.Hostname}}.{{.Domain}}"

    生成兩個CommonName :

    peer0.org2.example.com

    peer1.org2.example.com。

     

    2. 之后處理SAN (Subject Alternative Names), SAN是一個可選配置,主要是用於指定要生成的X509中的一個或是多個SAN,可以為hostname, commonname 或是IP地址形式。處理規則是:如果有指定CommonName, 就用指定的CommonName為解析模板,否則就是用默認的CommonName解析模板,數據源為hostName和 Domain, 這個例子中就為 peer0 (peer1)和 org2.example.com。 默認的解析模板為:

    "{{.Hostname}}.{{.Domain}}"

    例子中由於沒有指明CommonName,所以直接用默認模板,解析結果為:

    peer0.org2.example.com

    peer1.org2.example.com

     

    3. 之后是拼接SANS,根據上面的解析結果,默認設置的SANS為hostname和 CommonName, 也就是peer0(peer1)和peer0.org2.example.com (peer1. org2.example.com)。如果配置文件上有指定其他的CommonName,就把這兩個加入到指定的CommonName中,一起作為SANS,在生成正式的時候使用。

    下面是一個完整的Specs的示例,配置的時候可以參考 

        Specs:
         - Hostname: foo # implicitly "foo.org1.example.com"
           CommonName: foo27.org5.example.com
           SANS:
              - "bar.{{.Domain}}"
              - "altfoo.{{.Domain}}"
              - "{{.Hostname}}.org6.net"
              - 172.16.10.31
          - Hostname: bar
          - Hostname: baz
  • 處理yaml:CA 的配置。如果沒有指定ca配置,默認的ca的hostname為ca, 其它處理過程和yaml:Specs完全一致。

    下面是CA配置的一個完整示例:

         CA:
           Hostname: ca # implicitly ca.org1.example.com
           Country: US
           Province: California
           Locality: San Francisco
           OrganizationalUnit: Hyperledger Fabric
           StreetAddress: address for org # default nil
           PostalCode: postalCode for org # default nil

 

生成證書和公私鑰

 

  1. 生成節點的CA證書。創建 crypto-config/peerOrganizations/{domain}/ca 目錄,例子中為org.example.com。根據yaml:CA的配置,使用fabric的加密服務提供程序(bccsp),生成P256的橢圓加密算法的私鑰和公鑰,然后使用ca中指定的 country, province,common name等信息生成包含公鑰信息的ca.org2.example.com-cert.pem 文件

     

  2. 生成tls的證書。同上面的ca證書,只不過tls證書中的common name為 tlsca, 而上面的ca證書中的common name為ca

     

  3. 把ca下的證書和tls證書導入到crypto-config/peerOrganizations/org2.example.com/msp/cacerts和crypto-config/peerOrganizations/org2.example.com/msp/tlscacerts下

     

  4. 如果設置了EnableNodeOUs,就在msp下生成config.yaml文件 

  5. 根據配置的節點信息,為每一個節點創建本地的msp, 包括兩部分:

    第一部分為創建peers/{commonName}/msp 。例子中的就為:peers/peer0.org2.example.com/msp

    peers/peer1.org2.example.com/msp

    這部分證書都是通過csp產生一個keystore私鑰,然后使用這個私鑰對應的公鑰生成admincerts,cacerts,signcerts 的證書。而cacerts下的證書和peerOrganizations/{domain}/ca下ca.{domain}-cert.pem是完全一樣的。tlscacerts 下的證書也和{domain}下其他的tlscacerts文件夾下的證書完全一致。

     

    第二部分是生成peers/{commonName}/tls目錄下的公私鑰證書,例子中為:peers/peer0.org2.example.com/tls

    peers/peer1.org2.example.com/tls

    這部分證書是重新生成的。包含一個ca證書,一個公鑰證書和一個私鑰證書。如果節點類型為 client,就生成客戶端的公鑰證書和私鑰證書,如果節點類型為orderer或是peer類型,就生成服務端相關的證書。私鑰存在serer.key內。ca.crt是把證書內容通過x509.ParseCertificate轉換得到,而server.crt是通過把寫入了證書內容的pem文件直接重命名成crt文件得到。

     

  6. 根據配置的yaml:Users下的yaml:Count 的數目,來為每個用戶生成用戶信息,生成的內容和步驟和3.5完全一致。用戶名的生成規則為:從1開始循環遞增到Count, 每個用戶名為:"User" + index + @ + Domain , 例子中就為:User1@org2.example.com。默認會有一個admin用戶。

     

  7. 把用戶下的signcerts 作為admincerts copy到org1.example.com/msp/admincerts和org1.example.com/peers/{CommonName}/admincerts下。

     

到此,節點相關的所有證書信息已經生成。接下來是生成orderer相關的證書信息,過程和節點完全類似,這里就不累贅描述了。

 


 

覆蓋完整的區塊鏈知識體系,從入門到源碼,這里有真正想要的區塊鏈技術,歡迎大家關注微信號:蝸牛講技術。掃下面的二維碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM