MSP的主要的任務(wù)是運(yùn)用手中的證書來做身份和權(quán)限控制。在Fabric中證書的生成可以通過cryptogen來生成,基本上這是一種靜態(tài)工具,玩玩demo是可以的,不建議在生產(chǎn)環(huán)境下使用,官方推薦用Fabric-ca。不過沒關(guān)系,內(nèi)部邏輯都類似。
配置文件
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。
生成結(jié)構(gòu)
生成的文件分兩部分,peer和orderer。如下圖所示。
初看上面生成的文件有點(diǎn)懵,沒關(guān)系,下面我們以peer為例,來分析下,這些是怎么來的。
peer

orderer

cryptogen
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
}
- 生成橢圓曲線公私鑰對fe85445ac723e6c3c16084dc6f4bec0f17ef2e92fb255bbb00e9822772f3127e_sk
- 有興趣可以去看看genCertificateECDSA,如果template和parent相同,說明生成的是自簽名(self-signed)的證書。
- 還有SKI是取得私鑰的摘要
- 注意證書里面的CommonName和Organization,多說無益,直接看證書內(nèi)容就好。


tlsca
跟ca同理,這里只展示證書內(nèi)容,同樣要注意證書里面的CommonName和Organization

msp
admincerts
跟下面Admin@org1.example.com的證書保持一致

cacerts
err = x509Export(filepath.Join(baseDir, "cacerts", x509Filename(signCA.Name)), signCA.SignCert)
其實(shí)就是將ca的證書導(dǎo)出到這個目錄

tlscacerts
err = x509Export(filepath.Join(baseDir, "tlscacerts", x509Filename(tlsCA.Name)), tlsCA.SignCert)
同理將tlsca的證書導(dǎo)出到這個目錄

peers
peer0.org1.example.com
msp
admincerts
跟下面Admin@org1.example.com的證書保持一致

keystore
priv, _, err := csp.GeneratePrivateKey(keystore)
再次生成公私鑰對,可以看到跟之前完全不一樣,全新的一對

signcerts
cert, err := signCA.SignCertificate(filepath.Join(mspDir, "signcerts"),
name, ous, nil, ecPubKey, x509.KeyUsageDigitalSignature, []x509.ExtKeyUsage{})
第一次看來由ca來簽發(fā)證書。直接來看證書內(nèi)容。
- 怎么體現(xiàn)是由ca來簽發(fā)的?AKI,也就是Authority Key Identifier??梢匀ド厦娴腸a證書的SKI去比對。兩者是要嚴(yán)格一致的。
- 證書的其中一個功能是對外宣告,我包含的公鑰是合法的,放心用,可以看到這里包含的公鑰就是之前生成的。意味著數(shù)字簽名會用keystore的私鑰,讓其他人用證書里面的公鑰來驗(yàn)證。

cacerts
跟之前的處理一樣,這里也是ca的冗余
tlscacerts
跟之前的處理一樣,這里也是tlsca的冗余
tls
ca.crt
這里是tlsca的冗余,可以自行去比較,跟前面的tlsca完全一致
server.key
這里是針對tls重新生成的一對公私鑰,意味著要用tlsca簽發(fā)tls使用的證書。

server.crt

users
User1@org1.example.com
msp
admincerts
跟下面Admin@org1.example.com的證書保持一致

keystore
同上

signcerts
同上

cacerts
同上
tlscacerts
同上
tls
ca.crt
同上
client.key
同上

client.crt
同上

Admin@org1.example.com
msp
keystore
同上

admincerts
注意這里跟signcerts的一致,也是整體admin的證書

signcerts
同上

cacerts
同上
tlscacerts
同上
tls
ca.crt
同上
client.key
同上

client.crt
同上

總結(jié)
講這么多,還不如畫張圖來的清楚
當(dāng)時(shí)看的時(shí)候漏了,admincert是從User的signcert來,然后擴(kuò)散的。
Untitled Diagram.png
