20180413180640626.JPGMSP的主要的任务是运用手中的证书来做身份和权限控制。在Fabric中证书的生成可以通过cryptogen来生成,基本上这是一种静态工具,玩玩demo是可以的,不建议在生产环境下使用,官方推荐用Fabric-ca。不过没关系,内部逻辑都类似。
配置文件
OrdererOrgs:
- Name: Orderer
Domain: example.com
Specs:
- Hostname: orderer
PeerOrgs:
- Name: Org1
Domain: org1.example.com
Template:
Count: 1
Users:
Count: 1
- 基本上这个配置很简单,one orderer,one org,one peer from org,one user。
生成结构
生成的文件分两部分,peer和orderer。如下图所示。
初看上面生成的文件有点懵,没关系,下面我们以peer为例,来分析下,这些是怎么来的。
peer
1554305990325.pngorderer
1554306053688.pngcryptogen
peerOrganizations/org1.example.com
ca
func NewCA(baseDir, org, name, country, province, locality, orgUnit, streetAddress, postalCode string) (*CA, error) {
var response error
var ca *CA
err := os.MkdirAll(baseDir, 0755)
if err == nil {
priv, signer, err := csp.GeneratePrivateKey(baseDir)
response = err
if err == nil {
// get public signing certificate
ecPubKey, err := csp.GetECPublicKey(priv)
response = err
if err == nil {
template := x509Template()
//this is a CA
template.IsCA = true
template.KeyUsage |= x509.KeyUsageDigitalSignature |
x509.KeyUsageKeyEncipherment | x509.KeyUsageCertSign |
x509.KeyUsageCRLSign
template.ExtKeyUsage = []x509.ExtKeyUsage{
x509.ExtKeyUsageClientAuth,
x509.ExtKeyUsageServerAuth,
}
//set the organization for the subject
subject := subjectTemplateAdditional(country, province, locality, orgUnit, streetAddress, postalCode)
subject.Organization = []string{org}
subject.CommonName = name
template.Subject = subject
template.SubjectKeyId = priv.SKI()
x509Cert, err := genCertificateECDSA(baseDir, name, &template, &template,
ecPubKey, signer)
response = err
if err == nil {
ca = &CA{
Name: name,
Signer: signer,
SignCert: x509Cert,
Country: country,
Province: province,
Locality: locality,
OrganizationalUnit: orgUnit,
StreetAddress: streetAddress,
PostalCode: postalCode,
}
}
}
}
}
return ca, response
}
1554308756382.png 1554307718914.png
- 生成椭圆曲线公私钥对fe85445ac723e6c3c16084dc6f4bec0f17ef2e92fb255bbb00e9822772f3127e_sk
- 有兴趣可以去看看genCertificateECDSA,如果template和parent相同,说明生成的是自签名(self-signed)的证书。
- 还有SKI是取得私钥的摘要
- 注意证书里面的CommonName和Organization,多说无益,直接看证书内容就好。
tlsca
1554307878009.png跟ca同理,这里只展示证书内容,同样要注意证书里面的CommonName和Organization
msp
admincerts
1554311752052.png跟下面Admin@org1.example.com的证书保持一致
cacerts
err = x509Export(filepath.Join(baseDir, "cacerts", x509Filename(signCA.Name)), signCA.SignCert)
1554308194374.png其实就是将ca的证书导出到这个目录
tlscacerts
err = x509Export(filepath.Join(baseDir, "tlscacerts", x509Filename(tlsCA.Name)), tlsCA.SignCert)
1554308340854.png同理将tlsca的证书导出到这个目录
peers
peer0.org1.example.com
msp
admincerts
1554311752052.png跟下面Admin@org1.example.com的证书保持一致
keystore
priv, _, err := csp.GeneratePrivateKey(keystore)
1554309034404.png再次生成公私钥对,可以看到跟之前完全不一样,全新的一对
signcerts
cert, err := signCA.SignCertificate(filepath.Join(mspDir, "signcerts"),
name, ous, nil, ecPubKey, x509.KeyUsageDigitalSignature, []x509.ExtKeyUsage{})
1554309256158.png第一次看来由ca来签发证书。直接来看证书内容。
- 怎么体现是由ca来签发的?AKI,也就是Authority Key Identifier。可以去上面的ca证书的SKI去比对。两者是要严格一致的。
- 证书的其中一个功能是对外宣告,我包含的公钥是合法的,放心用,可以看到这里包含的公钥就是之前生成的。意味着数字签名会用keystore的私钥,让其他人用证书里面的公钥来验证。
cacerts
跟之前的处理一样,这里也是ca的冗余
tlscacerts
跟之前的处理一样,这里也是tlsca的冗余
tls
ca.crt
这里是tlsca的冗余,可以自行去比较,跟前面的tlsca完全一致
server.key
1554310326178.png这里是针对tls重新生成的一对公私钥,意味着要用tlsca签发tls使用的证书。
server.crt
1554310369592.pngusers
User1@org1.example.com
msp
admincerts
1554311752052.png跟下面Admin@org1.example.com的证书保持一致
keystore
1554310865758.png同上
signcerts
1554310832186.png同上
cacerts
同上
tlscacerts
同上
tls
ca.crt
同上
client.key
1554310981694.png同上
client.crt
1554311012410.png同上
Admin@org1.example.com
msp
keystore
1554311480554.png同上
admincerts
1554311367214.png注意这里跟signcerts的一致,也是整体admin的证书
signcerts
1554311574420.png同上
cacerts
同上
tlscacerts
同上
tls
ca.crt
同上
client.key
1554311627359.png同上
client.crt
1554311652573.png同上
总结
讲这么多,还不如画张图来的清楚
当时看的时候漏了,admincert是从User的signcert来,然后扩散的。
Untitled Diagram.png
网友评论