一 工具定义
Cryptogen是hyperleder fabric提供的为网络实体生成加密材料(公私钥/证书等)的实用程序。简单来说就是一个生成认证证书(x509 certs)的工具。这些证书代表一个身份,并允许在网络实体间通信和交易时进行签名和身份认证。
cryptogen使用一个包含网络拓扑的crypto-config.yaml文件,为文件中定义的组织和属于这些组织的实体生成一组证书和密钥。每个组织都配置唯一的根证书(ca-cert),并包含了特定的实体(peer和orders),这就形成了一种典型的网络结构–每个成员都有所属杜CA。hyperleder fabric网络中的交易和通信都使用实体私钥签名,使用公钥验证。
二 产生这个工具的原因
Cryptogen 全名 crypto generate ,fabric设计它是为了方便生产证书,目录这一系列的操作,它脱胎于go sdk下cryto包。
三 如何使用这个工具
在fabric中输入make cryptogen 或者直接在fabric/common/tools/cryptogen/下执行go build,就会在build/bin文件下生成一个名叫cryptogen的二进制程序。
这个工具用来读取crypto-config.yaml文件的内容来产生组织,证书,秘钥。
比如命令为:
cryptogen generate --config=./crypto-config.yaml --output ./crypto-config
理解就是 用cryptogen二进制程序 找到配置文件crypto-config.yaml 处理输出文件名为crypto-config的结果
但是crypto-config中只定义了组织相关的配置,实际需要用的生成证书,以及公私钥的配置在Fabric/common/tools/cryptogen下。
四 工具源码分析
该文件下目录
在源码上设计者将这个工具概念分成了4个部分:
CA 电子证书
csp 内容安全策略
metadata 元数据
msp 管理服务提供商
CA文件包分析:
Generator.go
该代码定义1个结构体,5个方法
1结构体 CA
电子签名证书 由名称 公私钥 证书构成
2方法 NewCA (baseDir, org, name string) (*CA, error)
作用创建CA 返回CA实体和报错
3方法 (ca *CA) SignCertificate(baseDir, name string, sans []string, pub *ecdsa.PublicKey, ku x509.KeyUsage, eku []x509.ExtKeyUsage) (*x509.Certificate, error)
作用签名证书 返回证书文件和报错
4方法genCertificateECDSA(baseDir, name string, template, parent *x509.Certificate, pub *ecdsa.PublicKey, priv interface{}) (*x509.Certificate, error)
将签名证书椭圆算法处理
5方法 x509Template() x509.Certificate
6方法 subjectTemplate() pkix.Name
ca文件
Generator.go
package ca
import ( //大量运行go sdk里的包
“crypto” //特别是crypto
“crypto/ecdsa”
“crypto/rand”
“crypto/x509”
“crypto/x509/pkix”
“encoding/pem”
“math/big”
“os”
“time”
“path/filepath” //引用fabric中自己写的csp包
“github.com/hyperledger/fabric/common/tools/cryptogen/csp”
)
type CA struct { //定义CA结构体 名称 秘钥 证书
Name string
//SignKey *ecdsa.PrivateKey
//这里2属性都是go sdk中的东西
Signer crypto.Signer //这里是结构体接口 里面是公钥 私钥
SignCert *x509.Certificate //结构体 证书
}
//NewCA 创建CA实例 并将签名密钥对保存在baseDir/名称
func NewCA(baseDir, org, name string) (*CA, error) {
var response error //用来记录错误
var ca *CA // 指向CA结构体
err := os.MkdirAll(baseDir, 0755) //在baseDir路径下创建文件目录
if err == nil { //目录创建成功
priv, signer, err := csp.GeneratePrivateKey(baseDir) //创建私钥priv,signer
response = err //记录报错
if err == nil { //私钥创建成功
// get public signing certificate
ecPubKey, err := csp.GetECPublicKey(priv) //通过私钥priv获取公钥ecpubkey
response = err //记录报错
if err == nil { //公钥创建成功
template := x509Template() //定义模板
//this is a CA
template.IsCA = true //模板属性isCA为true
//模板属性keyUsage
template.KeyUsage |= x509.KeyUsageDigitalSignature |
x509.KeyUsageKeyEncipherment | x509.KeyUsageCertSign |
x509.Ke