下文中所有的配置文件解析,都以 fabric-samples/first-network 中的配置来解析,如果需要可以克隆仓库:fabric-samples
crypto-config.yaml
先来理解一下,私钥与证书的相关概念
Fabric 中会有两种类型的公私钥和证书
给节点之间通讯安全而准备的TLS证书
用户登录和权限控制的用户证书。
来看下first-network/crypto-config.yaml
中的配置信息
原始文件注释信息较多,下面我用自己的理解中文表示代替了原始的英文注释,之后的文件解析也会是这样
OrdererOrgs: ## 定义管理orderer节点的组织
- Name: Orderer ## 这个组织的名字叫 Orderer
Domain: example.com ## 这个组织的域名是 example.com
# 生成证书的时候,证书内会包含Name和Domain信息,orderer.example.com就是这个组织的地址
EnableNodeOUs: true ## 如果设置了 EnableNodeOUs ,就在msp下生成config.yaml文件
# 对于一个Spec来说,配置了CommonName,那么文件夹则命名为CommonName
# 如果没有配置CommonName,则文件名为:{{.Hostname}}.{{Domain}}
# 在下面的例子中,在 crypto-config/ordererOrganizations/example.com/orderers 目录下
# 则会产生两个文件orderer.test.com和orderer5.test.com,
# 如果没有加CommonName,则目录名为order.example.com与order5.example.comn
Specs:
- Hostname: orderer
CommonName: orderer.test.com
# - Hostname: orderer2
# - Hostname: orderer3
# - Hostname: orderer4
- Hostname: orderer5
CommonName: orderer5.test.com
PeerOrgs: ## 定义管理peer节点的组织
- Name: Org1
Domain: org1.example.com
EnableNodeOUs: true
# Template是按照Template模板生成多个文件,数量由Count决定,起始编号由Start决定
# 如下配置会在crypto-config/peerOrganizations/org1.example.com/peers目录下,
# 生成两个文件,分别是 peer0.org1.example.com 和 peer1.org1.example.com
# 如果把Start注释去掉,那么会生成 peer5.org1.example.com 和 peer6.org1.example.com
Template:
Count: 2
# Start: 5
# Users是生成除了Admin之外多少个user,数量由Count决定
# 对于orderer组织,这个值设置了也没有效果
# 如果配置会在crypto-config/peerOrganizations/org1.example.com/users目录下,
# 生成两个文件,分别是[email protected]和[email protected]
# 如果改为2,那么会多一个[email protected]
Users:
Count: 1
# 如下如果在这里加入一个Specs,那么会在peers目录下生成3个文件了
# 包括,peer0.org2.example.com, peer1.org2.example.com 和 test.org2.example.com
- Name: Org2
Domain: org2.example.com
EnableNodeOUs: true
# Specs:
# - Hostname: test
Template:
Count: 2
Users:
Count: 1
通常来说
Fabric
使用了cryptogen
工具用来调用上面的配置文件生成私钥和证书
cryptogen generate --config=./crypto-config.yaml
执行完以后,会在当前目录生成一个 crypto-config 目录,当然也可以在命令中添加 --output 选项来指定输出的目录。在这个目录下就会根据 Orderer 和Peer 各自生成两个文件夹:
它们分别代表着orderer和peer的组织及对应目录下的证书文件。
每个组织下都有ca,tlsca,msp,orderers(或者peers),users等5个文件,下面通过tree命令的输出结果,分别解释一下各个目录的作用。
为了方便观看,部分重复的结构我就用省略号省去了
crypto-config
├── ordererOrganizations ## 组织配置
│ └── example.com ## 组织根域名
│ ├── ca ## 存放组织根证书及私钥
│ │ ├── ca.example.com-cert.pem ## 组织根证书,自签名
│ │ └── fe78d606843ca608b5eab2af24d09c51ebeac6fc6a31690c3ad77e55c2840835_sk ## 私钥
│ ├── msp ## 存放该组织身份信息
│ │ ├── admincerts ## 组织管理员
│ │ │ └── [email protected]-cert.pem ## 管理员身份验证证书,被根证书签名
│ │ ├── cacerts ## 组织的根证书
│ │ │ └── ca.example.com-cert.pem ## 组织的根证书,与ca里面的一致
│ │ ├── config.yaml ## 配置文件中加了 EnableNodeOUs 参数生成的config.yaml文件,记录 OrganizationalUnitIdentitifiers 信息,包括根证书位置和ID信息
│ │ └── tlscacerts ## 用于TLS的CA证书
│ │ └── tlsca.example.com-cert.pem ## 用于TLS的CA证书,自签名
│ ├── orderers ## 存放所有 Orderer 的身份信息
│ │ ├── orderer.example.com ## 第一个orderer的信息,msp与TLS
│ │ │ ├── msp
│ │ │ │ ├── admincerts ## 组织管理员的身份验证证书,与 msp.admincerts 保持一致
│ │ │ | | └── [email protected]-cert.pem ## orderer被给予这些证书来确认交易签名是否为管理员签名
│ │ │ │ ├── cacerts ## 存放组织根证书,与CA目录里一致
│ │ │ │ │ └── ca.example.com-cert.pem
│ │ │ │ ├── config.yaml
│ │ │ │ ├── keystore ## 本节点的身份私钥,用来签名
│ │ │ │ │ └── 0396add7d5658fcae2bb73c34af1b8b459d88839b30cd61fab1d60d1c4c0b703_sk
│ │ │ │ ├── signcerts ## 验证本节点签名的证书,被根证书签名
│ │ │ │ │ └── orderer.example.com-cert.pem
│ │ │ │ └── tlscacerts ## TLS连接用的身份证书,与 msp.tlscacerts 保持一致
│ │ │ │ └── tlsca.example.com-cert.pem
│ │ │ └── tls ## TLS的相关信息
│ │ │ ├── ca.crt ## 组织的根证书
│ │ │ ├── server.crt ## 验证本节点签名的证书,被根证书签名
│ │ │ └── server.key ## 本节点的身份私钥,用来签名
##############################################
# orderer2 到 orderer5 的信息,具体意义与orderer一致
##############################################
│ ├── tlsca ## 存放tls相关的证书和私钥
│ │ ├── 4dbdd5747a94468bd84e0e8bbc39935e894d4c62de1c66a77d6ca66853a24e14_sk ## tls私钥
│ │ └── tlsca.example.com-cert.pem ## tls证书
│ └── users ## 存放属于该组织的用户的实体
│ └── [email protected] ## 管理员用户的信息,其中包括msp证书和tls证书两类
│ ├── msp
│ │ ├── admincerts ## 组织管理员的身份验证证书,与 msp.admincerts 保持一致
│ | | └── [email protected]-cert.pem
│ │ ├── cacerts ## 存放组织根证书,与CA目录里一致
│ │ │ └── ca.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore ## 本用户的身份私钥,用来签名
│ │ │ └── ceefe40caaf06d02d09b1c5776f5dbf0749e056d49fb12fbab23f32b470b4645_sk
│ │ ├── signcerts ## 验证本用户的身份验证证书,被根证书签名,要被某个Orderer认可,则必须放到该 Orderer 的msp/admincerts目录下,因此上面orderer的msp/admincerts目录下的证书应该要是从这里复制一份过去
│ │ │ └── [email protected]-cert.pem
│ │ └── tlscacerts ## TLS连接用的身份证书,与 msp.tlscacerts 保持一致
│ │ └── tlsca.example.com-cert.pem
│ └── tls ## TLS的相关信息
│ ├── ca.crt
│ ├── client.crt ## 管理员身份验证证书,被根证书签名
│ └── client.key ## 管理员的身份私钥,用来签名
└── peerOrganizations ## peer组织
├── org1.example.com ## 第一个组织的所有身份证书
│ ├── ca ## 存放私钥与组织根证书
│ │ ├── ca.org1.example.com-cert.pem
│ │ └── e693ef19f57ec58c0c33b51ccf04d12871a793f01c513affacea685e26bbcacc_sk
│ ├── msp ## msp信息与order组织类似
│ │ ├── admincerts
│ | | └── [email protected]-cert.pem
│ │ ├── cacerts
│ │ │ └── ca.org1.example.com-cert.pem
│ │ ├── config.yaml
│ │ └── tlscacerts
│ │ └── tlsca.org1.example.com-cert.pem
│ ├── peers ## peers目录与order组织的orderers目录类似
│ │ ├── peer0.org1.example.com
│ │ │ ├── msp
│ │ │ │ ├── admincerts
│ | │ │ | └── [email protected]-cert.pem
│ │ │ │ ├── cacerts
│ │ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ │ ├── config.yaml
│ │ │ │ ├── keystore
│ │ │ │ │ └── a77da4f8c714456e7518c5d72346d96954264a5e056c05615b8492c90ce1d90c_sk
│ │ │ │ ├── signcerts
│ │ │ │ │ └── peer0.org1.example.com-cert.pem
│ │ │ │ └── tlscacerts
│ │ │ │ └── tlsca.org1.example.com-cert.pem
│ │ │ └── tls
│ │ │ ├── ca.crt
│ │ │ ├── server.crt
│ │ │ └── server.key
│ │ └── peer1.org1.example.com
│ │ ├── msp
│ │ │ ├── admincerts
| | │ | └── [email protected]-cert.pem
│ │ │ ├── cacerts
│ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── 97db71f3465954ed6822cfdc22879350fd3cf120442449c3053a56d6d3ab5241_sk
│ │ │ ├── signcerts
│ │ │ │ └── peer1.org1.example.com-cert.pem
│ │ │ └── tlscacerts
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── server.crt
│ │ └── server.key
│ ├── tlsca ## 存放tls相关的证书和私钥
│ │ ├── e72ab83e95bd44cf98029e1b0fb1afb616295ce0cf82924daaa20a8d37988d70_sk
│ │ └── tlsca.org1.example.com-cert.pem
│ └── users
│ ├── [email protected]
│ │ ├── msp
│ │ │ ├── admincerts
│ │ │ | └── [email protected]-cert.pem
│ │ │ ├── cacerts
│ │ │ │ └── ca.org1.example.com-cert.pem
│ │ │ ├── config.yaml
│ │ │ ├── keystore
│ │ │ │ └── b919e8acaad2e62f8dce761b7e282bfbf5f427626457069effc44cd44b2db287_sk
│ │ │ ├── signcerts
│ │ │ │ └── [email protected]-cert.pem
│ │ │ └── tlscacerts
│ │ │ └── tlsca.org1.example.com-cert.pem
│ │ └── tls
│ │ ├── ca.crt
│ │ ├── client.crt
│ │ └── client.key
│ └── [email protected]
│ ├── msp
│ │ ├── admincerts
│ │ | └── [email protected]-cert.pem
│ │ ├── cacerts
│ │ │ └── ca.org1.example.com-cert.pem
│ │ ├── config.yaml
│ │ ├── keystore
│ │ │ └── 3700db6a19f25b2e22e0315b9fb15ecc3b3a18a14ef463f4b4f2f98e43240ef6_sk
│ │ ├── signcerts
│ │ │ └── [email protected]-cert.pem
│ │ └── tlscacerts
│ │ └── tlsca.org1.example.com-cert.pem
│ └── tls
│ ├── ca.crt
│ ├── client.crt
│ └── client.key
└── org2.example.com
###########################
# 以下内容与org1.example.com类似
###########################
做一个补充说明
对于peer/orderer以及users来说,msp/keystore下是私钥,msp/signcerts下是证书。
tls下的server.key(peer下是client.key)和server.crt是私钥和证书
configtx.yaml,配外层的msp文件夹
MSPDir: crypto-config/ordererOrganizations/example.com/msp
peer的core.yaml文件,使用peers下面的msp文件夹
mspConfigPath: ../crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/msp
orderer的orderer.yaml文件,使用orderer下面的msp文件夹
LocalMSPDir: ../crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/msp
client和sdk端,使用users下面的msp文件夹
mspConfigPath: ../crypto-config/peerOrganizations/org1.example.com/users/[email protected]/msp