在fabric网络启动的过程中,会使用使用cryptogen 工具创建组织的证书文件,这时候就会用到crypto-config.yaml配置文件,例如fabric官方测试例程test-network中就用到了crypto-config-org1.yaml,crypto-config-org2.yaml,crypto-config-orderer.yaml三个配置文件。
crypto-config.yaml配置文件的结构十分简单,用于定义OrdererOrgs和PeerOrgs组织。每个组织中又可以定义多个节点(Spec)和用户(User)。
下面来看一下crypto-config-org1.yaml,crypto-config-org2.yaml,crypto-config-orderer.yaml配置文件。(这个几个文件在 ./fabric-samples/test-network/organizations/cryptogen文件夹下面)
Fabric网络通过证书和密钥来管理和认证成员身份,经常需要生成证书文件。为了方便批量管理组织证书,Fabric基于Go语言的标准crypto库提供了cryptogen(crypto generator)工具。cryptogen是静态产生fabric所需证书的工具,CA服务是一种动态的证书生产方式。一般来说在开发和测试阶段可以简单的使用cryptogen工具来产生所需要的证书,在生产网络中使用CA服务。
cryptogen可以根据指定配置(crypto-config.yaml)批量生成所需要的密钥和证书文件,或查看配置模板信息。
了解这些名词,就很容易看懂配置模板信息。
OrdererOrgs:定义管理orderer节点的组织
PeerOrgs:定义管理peer节点的组织
每个组织应该包含如下信息
名称(name),组织的名称
组织域(domain),组织的命名域
是否启用NodeOU,指定是否根据证书中的OU域来判断持有者角色
CA,组织的CA地址,包括Hostname域。
若干个节点,节点包括几个域(可以通过Specs来指定,或者通过Template来自动顺序生成)
- Hostname 主机名
- CommonName
- SANS
通过Template来自动顺序生成默认通用名为:主机名.组织域。
例如,域org1.example.com中Peer节点的名称可能为peer0.org1.example.com、peer1.org1.example.comdeng等。
用户,通过用户模板自动生成除admin外的用户个数。
# ---------------------------------------------------------------------------
# "OrdererOrgs" - 定义管理排序节点的组织
# ---------------------------------------------------------------------------
OrdererOrgs: # 定义OrdererOrgs类型组织
# ---------------------------------------------------------------------------
# Orderer
# ---------------------------------------------------------------------------
- Name: Orderer # 组织名
Domain: example.com # 组织域名
EnableNodeOUs: true # 启动EnableNodeOUs在msp下生成config.yaml文件
# ---------------------------------------------------------------------------
# "Specs" - See PeerOrgs for complete description
# ---------------------------------------------------------------------------
Specs:
- Hostname: orderer #节点域名,可以指定多个节点
# - Hostname: orderer1 # 举例
# - Hostname: orderer2 # 举例
# - Hostname: orderer3 # 举例
SANS: # 除了主机名,通用名外的主题别名
- localhost
# ---------------------------------------------------------------------------
# "PeerOrgs" - 管理peer节点的组织的定义
# ---------------------------------------------------------------------------
PeerOrgs:
# ---------------------------------------------------------------------------
# Org1 组织1,可以安装这个模板定义多个组织
# ---------------------------------------------------------------------------
- Name: Org1
Domain: org1.example.com
EnableNodeOUs: true
# ---------------------------------------------------------------------------
# "Specs" 过Specs来指定节点信息
# ---------------------------------------------------------------------------
# Uncomment this section to enable the explicit definition of hosts in your
# configuration. Most users will want to use Template, below
#
# Specs 是一个 Spec 条目数组。每个 Spec 条目由两个字段组成:
# - Hostname: (必需)所需的主机名。
# - CommonName: (可选的) 对于一个Spec来说,配置了CommonName,那么文件夹则命名为CommonName
# 如果没有配置CommonName,则文件名为:{{.Hostname}}.{{Domain}}
#
# 默认格式 "{{.Hostname}}.{{.Domain}}"
#
# which obtains its values from the Spec.Hostname and
# Org.Domain, respectively.
# ---------------------------------------------------------------------------
# - Hostname: foo # implicitly "foo.org1.example.com"
# CommonName: foo27.org5.example.com # overrides Hostname-based FQDN set above
# - Hostname: bar
# - Hostname: baz
# ---------------------------------------------------------------------------
# "Template" 或者通常Template生成节点
# ---------------------------------------------------------------------------
# 允许定义来自模板 1 个或多个按顺序创建的主机。
# 默认情况下,这从peer0 到 peer{{Count-1}} 。
# 可以设置起始索引(Start)
#
# Note: Template 和 Specs并不相斥.
# 可以一起使用创建爱节点
# 注意节点名称不要冲突
# ---------------------------------------------------------------------------
Template:
Count: 1
SANS:
- localhost
# Start: 5
# Hostname: {{.Prefix}}{{.Index}} # 默认
# ---------------------------------------------------------------------------
# "Users"
# ---------------------------------------------------------------------------
# Count:除 Admin 之外的用户帐户数
# ---------------------------------------------------------------------------
Users:
Count: 1
注意:
cryptogen主要功能包括:
可以使用:
cryptogen --help […] # 查看帮助信息,进行学习
例如:cryptogen --help generate
Generate key material # 作用生成关键材料
Flags: # 有的参数
–help Show context-sensitive help (also try --help-long and–help-man).
–output=“crypto-config” The output directory in which to place artifacts # 放置输出文件的目录文件夹
–config=CONFIG The configuration template to use #指定使用的配置模板
使用命令生成相应的密钥和证书文件
cd /root/fabric/scripts/fabric-samples/test-network/organizations/cryptogen/crypto-config # 进入到存放证书配置文件的文件夹
cryptogen generate --config=./crypto-config-orderer.yaml # 生成orderer组织的证书文件
cryptogen generate --config=crypto-config-org1.yaml # 生成org1组织的证书文件
cryptogen generate --config=./crypto-config-org2.yaml # 生成org2组织的证书文件
可以看到当前目录下的生成crypto-config目录:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kXcyTVG9-1677896503228)(assets/image-20230303111025-li3rvwb.png)]
crypto-config文件夹中生成ordererOrganizations和peerOrganizations两棵组织树。每棵组织树下都包括ca、tlsca、msp、orderers(或peers)、users等子目录。
最关键的是各个资源下的msp目录内容,存储了生成的代表MSP实体身份的各种证书文件,一般包括:
peerOrganizations为例做了详细的注释。
[root@gtt crypto-config]# tree
.
├── 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
│ │ └── orderer.example.com
│ │ ├── msp
│ │ │ ├── admincerts
│ │ │ ├── cacerts
│ │ │ │ └── ca.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── priv_sk
│ │ │ ├── signcerts
│ │ │ │ └── orderer.example.com-cert.pem
│ │ │ └── tlscacerts
│ │ │ └── tlsca.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── server.crt
│ │ └── server.key
│ ├── tlsca
│ │ ├── priv_sk
│ │ └── tlsca.example.com-cert.pem
│ └── users
│ └── [email protected]
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ │ └── ca.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore
│ │ │ └── priv_sk
│ │ ├── signcerts
│ │ │ └── [email protected]
│ │ └── tlscacerts
│ │ └── tlsca.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── peerOrganizations #peer组织相关
├── org1.example.com ##org1组织的相关材料
│ ├── ca ###存放组织的CA根证书和对应的私钥文件
│ │ ├── ca.org1.example.com-cert.pem
│ │ └── priv_sk
│ ├── msp ###存放代表该组织的身份信息,有时还存放中间层证书和运维证书。
│ │ ├── admincerts ####组织管理员的身份验证证书,被根证书签名。
│ │ ├── cacerts ####组织信任的CA根证书,同ca目录下文件
│ │ │ └── ca.org1.example.com-cert.pem
│ │ ├── config.yaml #### 指定是否开启OU(Organizational Unit),以及存放组织根证书路径和OU识别关键字
│ │ └── tlscacerts ####用于TLS验证的信任的CA证书,自签名
│ │ └── tlsca.org1.example.com-cert.pem
│ ├── peers ##存放属于该组织的所有Peer节点。
│ │ └── peer0.org1.example.com ###第一个Peer节点,包括其MSP证书和TLS证书。
│ │ ├── msp ####存放代表身份的相关证书和私钥文件
│ │ │ ├── admincerts #####该Peer认可的管理员的身份证书。
│ │ │ ├── cacerts ######存放组织的CA根证书。
│ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ ├── config.yaml #####指定是否开启OU
│ │ │ ├── keystore #####节点的身份私钥,用来签名。
│ │ │ │ └── priv_sk
│ │ │ ├── signcerts #####验证本节点签名的证书,被组织根证书签名。
│ │ │ │ └── peer0.org1.example.com-cert.pem
│ │ │ └── tlscacerts #####TLS连接用的CA证书
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ └── tls ####存放与tls相关的证书和私钥。
│ │ ├── ca.crt #####组织的TLS CA证书
│ │ ├── server.crt #####验证本节点签名的证书,被组织根证书签名。
│ │ └── server.key #####本节点的TLS私钥,用来签名。
│ ├── tlsca ###存放属于该组织的TLS证书和对应私钥
│ │ ├── priv_sk
│ │ └── tlsca.org1.example.com-cert.pem
│ └── users ###存放属于该组织的用户的实体
│ ├── [email protected]
│ │ ├── msp
│ │ │ ├── admincerts #####管理员用户的信息
│ │ │ ├── cacerts
│ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── priv_sk
│ │ │ ├── signcerts
│ │ │ │ └── [email protected]
│ │ │ └── tlscacerts
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── client.crt
│ │ └── client.key
│ └── [email protected] #####第一个用户的信息
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ │ └── ca.org1.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore
│ │ │ └── priv_sk
│ │ ├── signcerts
│ │ │ └── [email protected]
│ │ └── tlscacerts
│ │ └── tlsca.org1.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── org2.example.com
├── ca
│ ├── ca.org2.example.com-cert.pem
│ └── priv_sk
├── msp
│ ├── admincerts
│ ├── cacerts
│ │ └── ca.org2.example.com-cert.pem
│ ├── config.yaml
│ └── tlscacerts
│ └── tlsca.org2.example.com-cert.pem
├── peers
│ └── peer0.org2.example.com
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ │ └── ca.org2.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore
│ │ │ └── priv_sk
│ │ ├── signcerts
│ │ │ └── peer0.org2.example.com-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.org2.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── server.crt
│ └── server.key
├── tlsca
│ ├── priv_sk
│ └── tlsca.org2.example.com-cert.pem
└── users
├── [email protected]
│ ├── msp
│ │ ├── admincerts
│ │ ├── cacerts
│ │ │ └── ca.org2.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore
│ │ │ └── priv_sk
│ │ ├── signcerts
│ │ │ └── [email protected]
│ │ └── tlscacerts
│ │ └── tlsca.org2.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── [email protected]
├── msp
│ ├── admincerts
│ ├── cacerts
│ │ └── ca.org2.example.com-cert.pem
│ ├── config.yaml
│ ├── keystore
│ │ └── priv_sk
│ ├── signcerts
│ │ └── [email protected]
│ └── tlscacerts
│ └── tlsca.org2.example.com-cert.pem
└── tls
├── ca.crt
├── client.crt
└── client.key
cryptogen extend用于扩展已有的密钥和证书文件
$ cryptogen extend --help # 使用帮助命令查看参数
usage: cryptogen extend [<flags>]
Extend existing network # 拓展存在的网络
Flags:
--help Show context-sensitive help (also try --help-long and--help-man).
--input="crypto-config" 当前已存在的密钥和证书文件的路径,默认为当前目录下的crypto-config目录。
--config=CONFIG 指定所采用的配置模板文件的路径
# 例如,修改配置文件org3-crypto.yaml,添加新的组织org3,扩展已有的密钥和证书文件。
$ cryptogen extend --config ./org3-crypto.yaml --input crypto-config
# 这两个命令很简单,直接使用命令即可
$ cryptogen showtemplate
$ cryptogen version