Hyperledger Fabric 生成组织身份解析

fabric 版本 2.4.1

Fabric网络通过证书和密钥来管理和认证成员身份,经常需要生成证书文件。通常这些操作可以使用PKI服务(如Fabric-CA)或者OpenSSL工具来实现(针对单个证书的签发)。为了方便批量管理组织证书,Fabric基于Go语言的标准crypto库提供了 cryptogen (crypto generator)工具。cryptogen可以根据指定配置批量生成所需要的密钥和证书文件,或查看配置模板信息。

cryptogen 工具

usage: cryptogen [<flags>] <command> [<args> ...]

Utility for generating Hyperledger Fabric key material

Flags:
  --help  Show context-sensitive help (also try --help-long and --help-man).

Commands:
  help [<command>...]
    Show help.

  generate [<flags>]
    Generate key material

  showtemplate
    Show the default configuration template

  version
    Show version information

  extend [<flags>]
    Extend existing network

命令

参数

作用

generate

--output(生成的身份信息文件存放目录,默认为 crypto-config) , --config(使用的crypto-config.yaml文件路径)

N/A

showtemplate

N/A

显示默认配置模板

extend

--input(身份信息文件存放目录,默认为 crypto-config) , --config(使用的crypto-config.yaml文件路径)

N/A

version

N/A

查看版本信息

showtemplate 会展示一个 crypto-config.yaml 配置文件模板,一般情况下,配置文件中会指定网络的拓扑结构,还可以指定两类组织的信息:

● OrdererOrgs,构成Orderer集群的节点所属组织。

● PeerOrgs,构成Peer集群的节点所属组织。

使用下面命令将 howtemplate 命令输出的内容输出到一个文件中:

cryptogen howtemplate > crypto-config.yaml
# ---------------------------------------------------------------------------
# "OrdererOrgs" - Definition of organizations managing orderer nodes
# ---------------------------------------------------------------------------
OrdererOrgs:
  # ---------------------------------------------------------------------------
  # Orderer
  # ---------------------------------------------------------------------------
  - Name: Orderer
    Domain: example.com
    EnableNodeOUs: false

    # ---------------------------------------------------------------------------
    # "Specs" - See PeerOrgs below for complete description
    # ---------------------------------------------------------------------------
    Specs:
      - Hostname: orderer

# ---------------------------------------------------------------------------
# "PeerOrgs" - Definition of organizations managing peer nodes
# ---------------------------------------------------------------------------
PeerOrgs:
  # ---------------------------------------------------------------------------
  # Org1
  # ---------------------------------------------------------------------------
  - Name: Org1
    Domain: 
    EnableNodeOUs: false

    # ---------------------------------------------------------------------------
    # "CA"
    # ---------------------------------------------------------------------------
    # Uncomment this section to enable the explicit definition of the CA for this
    # organization.  This entry is a Spec.  See "Specs" section below for details.
    # ---------------------------------------------------------------------------
    # CA:
    #    Hostname: ca # implicitly ca.
    #    Country: US
    #    Province: California
    #    Locality: San Francisco
    #    OrganizationalUnit: Hyperledger Fabric
    #    StreetAddress: address for org # default nil
    #    PostalCode: postalCode for org # default nil

    # ---------------------------------------------------------------------------
    # "Specs"
    # ---------------------------------------------------------------------------
    # Uncomment this section to enable the explicit definition of hosts in your
    # configuration.  Most users will want to use Template, below
    #
    # Specs is an array of Spec entries.  Each Spec entry consists of two fields:
    #   - Hostname:   (Required) The desired hostname, sans the domain.
    #   - CommonName: (Optional) Specifies the template or explicit override for
    #                 the CN.  By default, this is the template:
    #
    #                              "{{.Hostname}}.{{.Domain}}"
    #
    #                 which obtains its values from the Spec.Hostname and
    #                 Org.Domain, respectively.
    #   - SANS:       (Optional) Specifies one or more Subject Alternative Names
    #                 to be set in the resulting x509. Accepts template
    #                 variables {{.Hostname}}, {{.Domain}}, {{.CommonName}}. IP
    #                 addresses provided here will be properly recognized. Other
    #                 values will be taken as DNS names.
    #                 NOTE: Two implicit entries are created for you:
    #                     - {{ .CommonName }}
    #                     - {{ .Hostname }}
    # ---------------------------------------------------------------------------
    # Specs:
    #   - Hostname: foo # implicitly "foo."
    #     CommonName:  # overrides Hostname-based FQDN set above
    #     SANS:
    #       - "bar.{{.Domain}}"
    #       - "altfoo.{{.Domain}}"
    #       - "{{.Hostname}}."
    #       - 172.16.10.31
    #   - Hostname: bar
    #   - Hostname: baz

    # ---------------------------------------------------------------------------
    # "Template"
    # ---------------------------------------------------------------------------
    # Allows for the definition of 1 or more hosts that are created sequentially
    # from a template. By default, this looks like "peer%d" from 0 to Count-1.
    # You may override the number of nodes (Count), the starting index (Start)
    # or the template used to construct the name (Hostname).
    #
    # Note: Template and Specs are not mutually exclusive.  You may define both
    # sections and the aggregate nodes will be created for you.  Take care with
    # name collisions
    # ---------------------------------------------------------------------------
    Template:
      Count: 1
      # Start: 5
      # Hostname: {{.Prefix}}{{.Index}} # default
      # SANS:
      #   - "{{.Hostname}}.alt.{{.Domain}}"

    # ---------------------------------------------------------------------------
    # "Users"
    # ---------------------------------------------------------------------------
    # Count: The number of user accounts _in addition_ to Admin
    # ---------------------------------------------------------------------------
    Users:
      Count: 1

  # ---------------------------------------------------------------------------
  # Org2: See "Org1" for full specification
  # ---------------------------------------------------------------------------
  - Name: Org2
    Domain: 
    EnableNodeOUs: false
    Template:
      Count: 1
    Users:
      Count: 1

配置项

作用

默认值

name

组织的名称

N/A

domain

组织的域名

N/A

EnableNodeOUs

是否启用NodeOU,指定是否根据证书中的OU域来判断持有者角色

false

CA

组织的CA地址,包括Hostname域


Specs.Hostname

可以直接用 Hostname 多次指定若干节点

N/A

Specs.CommonName

(可选配置)指定CN的模板或显式覆盖。模板:"{{. hostname}}.{{.Domain}}

N/A

Specs.SANS

这里可以配置节点支持的多个域名或者 IP

N/A

Template

指定自动生成节点的个数

1

Users.Count

顺序生成指定个数的普通用户(除默认的Admin用户外)

1

SAN (Subject Alternative Name) 是 SSL 标准 x509 中定义的一个扩展。使用了 SAN 字段的 SSL 证书,可以扩展此证书支持的域名,使得一个证书可以支持多个不同域名的解析。SAN SSL证书使您可以通过在注册时添加到SAN字段来确保域名和子域,本地主机名和IP地址的安全性,证书的安装过程和管理也更易于管理,也就是我们常说的多域名SSL证书。

生成网络身份信息文件:

cryptogen generate --config rypto-config.yaml --output crypto-config

crypto-config 目录结构:

crypto-config
├── ordererOrganizations
│   └── example.com
│       ├── ca
│       │   ├── ca.example.com-cert.pem
│       │   └── priv_sk
│       ├── msp
│       │   ├── admincerts
│       │   ├── cacerts
│       │   │   └── ca.example.com-cert.pem
│       │   ├── config.yaml
│       │   └── tlscacerts
│       │       └── tlsca.example.com-cert.pem
│       ├── orderers
│       │   ├── 
│       │   │   ├── msp
│       │   │   │   ├── admincerts
│       │   │   │   ├── cacerts
│       │   │   │   │   └── ca.example.com-cert.pem
│       │   │   │   ├── config.yaml
│       │   │   │   ├── keystore
│       │   │   │   │   └── priv_sk
│       │   │   │   ├── signcerts
│       │   │   │   │   └── -cert.pem
│       │   │   │   └── tlscacerts
│       │   │   │       └── tlsca.example.com-cert.pem
│       │   │   └── tls
│       │   │       ├── ca.crt
│       │   │       ├── server.crt
│       │   │       └── server.key
│       │   ├── 
│       │   │   ├── msp
│       │   │   │   ├── admincerts
│       │   │   │   ├── cacerts
│       │   │   │   │   └── ca.example.com-cert.pem
│       │   │   │   ├── config.yaml
│       │   │   │   ├── keystore
│       │   │   │   │   └── priv_sk
│       │   │   │   ├── signcerts
│       │   │   │   │   └── -cert.pem
│       │   │   │   └── tlscacerts
│       │   │   │       └── tlsca.example.com-cert.pem
│       │   │   └── tls
│       │   │       ├── ca.crt
│       │   │       ├── server.crt
│       │   │       └── server.key
│       │   └── 
│       │       ├── msp
│       │       │   ├── admincerts
│       │       │   ├── cacerts
│       │       │   │   └── ca.example.com-cert.pem
│       │       │   ├── config.yaml
│       │       │   ├── keystore
│       │       │   │   └── priv_sk
│       │       │   ├── signcerts
│       │       │   │   └── -cert.pem
│       │       │   └── tlscacerts
│       │       │       └── tlsca.example.com-cert.pem
│       │       └── tls
│       │           ├── ca.crt
│       │           ├── server.crt
│       │           └── server.key
│       ├── tlsca
│       │   ├── priv_sk
│       │   └── tlsca.example.com-cert.pem
│       └── users
│           └── Admin@example.com
│               ├── msp
│               │   ├── admincerts
│               │   ├── cacerts
│               │   │   └── ca.example.com-cert.pem
│               │   ├── config.yaml
│               │   ├── keystore
│               │   │   └── priv_sk
│               │   ├── signcerts
│               │   │   └── Admin@example.com-cert.pem
│               │   └── tlscacerts
│               │       └── tlsca.example.com-cert.pem
│               └── tls
│                   ├── ca.crt
│                   ├── client.crt
│                   └── client.key
└── peerOrganizations
    ├── 
    │   ├── ca
    │   │   ├── ca.-cert.pem
    │   │   └── priv_sk
    │   ├── msp
    │   │   ├── admincerts
    │   │   ├── cacerts
    │   │   │   └── ca.-cert.pem
    │   │   ├── config.yaml
    │   │   └── tlscacerts
    │   │       └── tlsca.-cert.pem
    │   ├── peers
    │   │   ├── peer0.
    │   │   │   ├── msp
    │   │   │   │   ├── admincerts
    │   │   │   │   ├── cacerts
    │   │   │   │   │   └── ca.-cert.pem
    │   │   │   │   ├── config.yaml
    │   │   │   │   ├── keystore
    │   │   │   │   │   └── priv_sk
    │   │   │   │   ├── signcerts
    │   │   │   │   │   └── peer0.-cert.pem
    │   │   │   │   └── tlscacerts
    │   │   │   │       └── tlsca.-cert.pem
    │   │   │   └── tls
    │   │   │       ├── ca.crt
    │   │   │       ├── server.crt
    │   │   │       └── server.key
    │   │   └── peer1.
    │   │       ├── msp
    │   │       │   ├── admincerts
    │   │       │   ├── cacerts
    │   │       │   │   └── ca.-cert.pem
    │   │       │   ├── config.yaml
    │   │       │   ├── keystore
    │   │       │   │   └── priv_sk
    │   │       │   ├── signcerts
    │   │       │   │   └── peer1.-cert.pem
    │   │       │   └── tlscacerts
    │   │       │       └── tlsca.-cert.pem
    │   │       └── tls
    │   │           ├── ca.crt
    │   │           ├── server.crt
    │   │           └── server.key
    │   ├── tlsca
    │   │   ├── priv_sk
    │   │   └── tlsca.-cert.pem
    │   └── users
    │       ├── Admin@
    │       │   ├── msp
    │       │   │   ├── admincerts
    │       │   │   ├── cacerts
    │       │   │   │   └── ca.-cert.pem
    │       │   │   ├── config.yaml
    │       │   │   ├── keystore
    │       │   │   │   └── priv_sk
    │       │   │   ├── signcerts
    │       │   │   │   └── Admin@-cert.pem
    │       │   │   └── tlscacerts
    │       │   │       └── tlsca.-cert.pem
    │       │   └── tls
    │       │       ├── ca.crt
    │       │       ├── client.crt
    │       │       └── client.key
    │       └── User1@
    │           ├── msp
    │           │   ├── admincerts
    │           │   ├── cacerts
    │           │   │   └── ca.-cert.pem
    │           │   ├── config.yaml
    │           │   ├── keystore
    │           │   │   └── priv_sk
    │           │   ├── signcerts
    │           │   │   └── User1@-cert.pem
    │           │   └── tlscacerts
    │           │       └── tlsca.-cert.pem
    │           └── tls
    │               ├── ca.crt
    │               ├── client.crt
    │               └── client.key
    └── 
        ├── ca
        │   ├── ca.-cert.pem
        │   └── priv_sk
        ├── msp
        │   ├── admincerts
        │   ├── cacerts
        │   │   └── ca.-cert.pem
        │   ├── config.yaml
        │   └── tlscacerts
        │       └── tlsca.-cert.pem
        ├── peers
        │   ├── peer0.
        │   │   ├── msp
        │   │   │   ├── admincerts
        │   │   │   ├── cacerts
        │   │   │   │   └── ca.-cert.pem
        │   │   │   ├── config.yaml
        │   │   │   ├── keystore
        │   │   │   │   └── priv_sk
        │   │   │   ├── signcerts
        │   │   │   │   └── peer0.-cert.pem
        │   │   │   └── tlscacerts
        │   │   │       └── tlsca.-cert.pem
        │   │   └── tls
        │   │       ├── ca.crt
        │   │       ├── server.crt
        │   │       └── server.key
        │   └── peer1.
        │       ├── msp
        │       │   ├── admincerts
        │       │   ├── cacerts
        │       │   │   └── ca.-cert.pem
        │       │   ├── config.yaml
        │       │   ├── keystore
        │       │   │   └── priv_sk
        │       │   ├── signcerts
        │       │   │   └── peer1.-cert.pem
        │       │   └── tlscacerts
        │       │       └── tlsca.-cert.pem
        │       └── tls
        │           ├── ca.crt
        │           ├── server.crt
        │           └── server.key
        ├── tlsca
        │   ├── priv_sk
        │   └── tlsca.-cert.pem
        └── users
            ├── Admin@
            │   ├── msp
            │   │   ├── admincerts
            │   │   ├── cacerts
            │   │   │   └── ca.-cert.pem
            │   │   ├── config.yaml
            │   │   ├── keystore
            │   │   │   └── priv_sk
            │   │   ├── signcerts
            │   │   │   └── Admin@-cert.pem
            │   │   └── tlscacerts
            │   │       └── tlsca.-cert.pem
            │   └── tls
            │       ├── ca.crt
            │       ├── client.crt
            │       └── client.key
            └── User1@
                ├── msp
                │   ├── admincerts
                │   ├── cacerts
                │   │   └── ca.-cert.pem
                │   ├── config.yaml
                │   ├── keystore
                │   │   └── priv_sk
                │   ├── signcerts
                │   │   └── User1@-cert.pem
                │   └── tlscacerts
                │       └── tlsca.-cert.pem
                └── tls
                    ├── ca.crt
                    ├── client.crt
                    └── client.key

组织(例如:/) 相关身份文件目录 :

目录

存放文件说明

ca

存放组织的CA根证书和对应的私钥文件,默认采用ECDSA算法,证书为自签名。组织内的实体将该根证书作为证书根

msp

存放代表该组织的身份信息,有时还存放中间层证书和运维证书

msp/admincerts

组织管理员的身份验证证书,被根证书签名

msp/cacerts

组织信任的CA根证书,同ca目录下文件

msp/tlscacerts

用于TLS验证的信任的CA证书,自签名

msp/config.yaml

指定是否开启OU(OrganizationalUnit),以及存放组织根证书路径和OU识别关键字

users/Admin

管理员用户的信息,包括其MSP证书和TLS证书

users/Admin/msp

存放代表身份的相关证书和私钥文件

users/Admin/tls

存放与tls相关的证书和私钥

其他用户身份文件目录和 Admin 类似。

组织节点(例如:/peers/peer0./ ) 相关身份文件目录 :

目录

存放文件说明

msp

存放代表身份的相关证书和私钥文件

msp/admincerts

该Peer认可的管理员的身份证书。Peer将基于这里的证书来认证交易签署者是否为管理员身份。这里默认存放有组织Admin用户的身份证书。

msp/cacerts

存放组织的CA根证书

msp/keystore

节点的身份私钥,用来签名

msp/signcerts

验证本节点签名的证书,被组织根证书签名

msp/tlscacerts

TLS连接用的CA证书,默认只有组织TLSCA证书

msp/ig.yaml

指定是否开启OU,以及存放组织根证书路径和OU识别关键字

tls

存放与tls相关的证书和私钥

tls/ca.crt

组织的TLS CA证书

tls/server.crt

验证本节点签名的证书,被组织根证书签名

tls/server.key

本节点的TLS私钥,用来签名