@@ -45,29 +45,39 @@ const (
4545// dir
4646// └── crypto
4747//
48- // └── ordererOrganizations
49- // └── org{partyID}
50- // ├── ca
51- // ├── tlsca
52- // ├── orderers
53- // │ └── party{partyID}
54- // │ ├── router
55- // │ │ ├── tls
56- // │ │ └── msp
57- // │ │ ├── cacerts
58- // │ │ ├── intermediatecerts
59- // │ │ ├── admincerts (ignored)
60- // │ │ ├── keystore
61- // │ │ ├── signcerts
62- // │ │ ├── tlscacerts
63- // │ │ └── tlsintermediatecerts
64- // │ ├── batcher1
65- // │ ├── batcher2
66- // │ ├── ...
67- // │ ├── batcher{shards}
68- // │ ├── consenter
69- // │ └── assembler
70- // └── users
48+ // └── ordererOrganizations
49+ // └── org{partyID}
50+ // ├── ca
51+ // ├── tlsca
52+ // ├── orderers
53+ // │ └── party{partyID}
54+ // │ ├── router
55+ // │ │ ├── tls
56+ // │ │ └── msp
57+ // │ │ ├── cacerts
58+ // │ │ ├── intermediatecerts
59+ // │ │ ├── admincerts (ignored)
60+ // │ │ ├── keystore
61+ // │ │ ├── signcerts
62+ // │ │ ├── tlscacerts
63+ // │ │ └── tlsintermediatecerts
64+ // │ ├── batcher1
65+ // │ ├── batcher2
66+ // │ ├── ...
67+ // │ ├── batcher{shards}
68+ // │ ├── consenter
69+ // │ └── assembler
70+ // └── users
71+ // └── user (admin, orderer loadgen)
72+ // ├── tls
73+ // └── msp
74+ // ├── cacerts
75+ // ├── intermediatecerts
76+ // ├── admincerts (ignored)
77+ // ├── keystore
78+ // ├── signcerts
79+ // ├── tlscacerts
80+ // └── tlsintermediatecerts
7181func GenerateCryptoConfig (networkConfig * genconfig.Network , outputDir string ) error {
7282 // create folder structure for the crypto files
7383 err := generateNetworkCryptoConfigFolderStructure (outputDir , networkConfig )
@@ -182,6 +192,12 @@ func createNetworkCryptoMaterial(dir string, network *genconfig.Network) error {
182192 if err != nil {
183193 return err
184194 }
195+
196+ // signing crypto to user
197+ err = createUserSignCertAndPrivateKey (signCA , dir , party .ID , nil )
198+ if err != nil {
199+ return err
200+ }
185201 }
186202 return nil
187203}
@@ -245,11 +261,11 @@ func createUserTLSCertKeyPair(ca *ca.CA, dir string, partyID types.PartyID, node
245261 return fmt .Errorf ("err: %s, failed marshaling private key for user for party %d" , err , partyID )
246262 }
247263
248- ca .SignCertificate (filepath .Join (dir , "crypto" , "ordererOrganizations" , fmt .Sprintf ("org%d" , partyID ), "users" ), "user-tls" , nil , nodesIPs , getPublicKey (privateKey ), x509 .KeyUsageKeyEncipherment | x509 .KeyUsageDigitalSignature , []x509.ExtKeyUsage {
264+ ca .SignCertificate (filepath .Join (dir , "crypto" , "ordererOrganizations" , fmt .Sprintf ("org%d" , partyID ), "users" , "user" , "tls" ), "user-tls" , nil , nodesIPs , getPublicKey (privateKey ), x509 .KeyUsageKeyEncipherment | x509 .KeyUsageDigitalSignature , []x509.ExtKeyUsage {
249265 x509 .ExtKeyUsageClientAuth ,
250266 x509 .ExtKeyUsageServerAuth ,
251267 })
252- err = writePEMToFile (filepath .Join (dir , "crypto" , "ordererOrganizations" , fmt .Sprintf ("org%d" , partyID ), "users" , "user-key.pem" ), "PRIVATE KEY" , privateKeyBytes )
268+ err = writePEMToFile (filepath .Join (dir , "crypto" , "ordererOrganizations" , fmt .Sprintf ("org%d" , partyID ), "users" , "user" , "tls" , "user -key.pem" ), "PRIVATE KEY" , privateKeyBytes )
253269 if err != nil {
254270 return err
255271 }
@@ -276,6 +292,25 @@ func createSignCertAndPrivateKeyForNode(ca *ca.CA, dir string, endpoint string,
276292 return nil
277293}
278294
295+ // createUserSignCertAndPrivateKey creates for user a signed certificate with a corresponding private key used for signing and write them into files.
296+ func createUserSignCertAndPrivateKey (ca * ca.CA , dir string , partyID types.PartyID , nodesIPs []string ) error {
297+ privateKey , err := ecdsa .GenerateKey (elliptic .P256 (), rand .Reader )
298+ if err != nil {
299+ return fmt .Errorf ("err: %s, failed creating private key for user of party %d" , err , partyID )
300+ }
301+ privateKeyBytes , err := x509 .MarshalPKCS8PrivateKey (privateKey )
302+ if err != nil {
303+ return fmt .Errorf ("err: %s, failed marshaling private key for user of party %d" , err , partyID )
304+ }
305+
306+ ca .SignCertificate (filepath .Join (dir , "crypto" , "ordererOrganizations" , fmt .Sprintf ("org%d" , partyID ), "users" , "user" , "msp" , "signcerts" ), "sign" , nil , nodesIPs , getPublicKey (privateKey ), x509 .KeyUsageDigitalSignature , []x509.ExtKeyUsage {})
307+ err = writePEMToFile (filepath .Join (dir , "crypto" , "ordererOrganizations" , fmt .Sprintf ("org%d" , partyID ), "users" , "user" , "msp" , "keystore" , "priv_sk" ), "PRIVATE KEY" , privateKeyBytes )
308+ if err != nil {
309+ return err
310+ }
311+ return nil
312+ }
313+
279314// generateNetworkCryptoConfigFolderStructure creates folders where the crypto material is written to.
280315func generateNetworkCryptoConfigFolderStructure (dir string , network * genconfig.Network ) error {
281316 var folders []string
@@ -333,6 +368,12 @@ func generateOrdererOrg(rootDir string, folders []string, partyID int, shards in
333368 }
334369
335370 folders = append (folders , filepath .Join (orgDir , "users" ))
371+ userMSPPath := filepath .Join (orgDir , "users" , "user" , "msp" )
372+ folders = append (folders , userMSPPath )
373+ for _ , subDir := range mspSubDirs {
374+ folders = append (folders , filepath .Join (userMSPPath , subDir ))
375+ }
376+ folders = append (folders , filepath .Join (orgDir , "users" , "user" , "tls" ))
336377
337378 return folders
338379}
0 commit comments