Skip to content

Commit dfc3077

Browse files
committed
Enhancements for cryptogen
Added a few additional features and fixed a minor bug - corrected folder name for orderer orgs to use captial "O" to be in line with naming convention used elsewhere - generate an admin user for each org and properly populate the admincerts folder for the org MSP - added new command line flag "-peerOrgUsers" which will generate the specified number of users for each peer organization Prior to this change the root certificates generated for each org's CA could not be use as TLS server certs. This change adds the server auth useage extension to those certs Change-Id: I949d99468422c6cfd00f83f6faad9c572fc08a03 Signed-off-by: Gari Singh <[email protected]>
1 parent a71af56 commit dfc3077

File tree

2 files changed

+90
-2
lines changed

2 files changed

+90
-2
lines changed

common/tools/cryptogen/ca/generator.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ func NewCA(baseDir, name string) (*CA, error) {
6464
//this is a CA
6565
template.IsCA = true
6666
template.KeyUsage |= x509.KeyUsageCertSign | x509.KeyUsageCRLSign
67-
template.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageAny}
67+
template.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageAny, x509.ExtKeyUsageServerAuth}
6868

6969
//set the organization for the subject
7070
subject := subjectTemplate()

common/tools/cryptogen/main.go

+89-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package main
1818
import (
1919
"flag"
2020
"fmt"
21+
"io"
2122
"os"
2223
"path/filepath"
2324

@@ -28,8 +29,10 @@ import (
2829
const (
2930
peerOrgBaseName = "peerOrg"
3031
peerBaseName = "Peer"
32+
userBaseName = "User"
33+
adminBaseName = "Admin"
3134
orderOrgBaseName = "ordererOrg"
32-
ordererBaseName = "orderer"
35+
ordererBaseName = "Orderer"
3336
)
3437

3538
//command line flags
@@ -38,6 +41,8 @@ var (
3841
"number of unique organizations with peers")
3942
numPeers = flag.Int("peersPerOrg", 1,
4043
"number of peers per organization")
44+
numPeerOrgUsers = flag.Int("peerOrgUsers", 1,
45+
"number of users per peer organization")
4146
numOrderers = flag.Int("ordererNodes", 1,
4247
"number of ordering service nodes")
4348
baseDir = flag.String("baseDir", ".",
@@ -87,6 +92,8 @@ func generatePeerOrgs(baseDir string, orgNames []string) {
8792
caDir := filepath.Join(orgDir, "ca")
8893
mspDir := filepath.Join(orgDir, "msp")
8994
peersDir := filepath.Join(orgDir, "peers")
95+
usersDir := filepath.Join(orgDir, "users")
96+
adminCertsDir := filepath.Join(mspDir, "admincerts")
9097
rootCA, err := ca.NewCA(caDir, orgName)
9198
if err != nil {
9299
fmt.Printf("Error generating CA for org %s:\n%v\n", orgName, err)
@@ -106,9 +113,52 @@ func generatePeerOrgs(baseDir string, orgNames []string) {
106113
orgName, peerBaseName, i))
107114
}
108115
generateNodes(peersDir, peerNames, rootCA)
116+
117+
// TODO: add ability to specify usernames
118+
usernames := []string{}
119+
for j := 1; j <= *numPeerOrgUsers; j++ {
120+
usernames = append(usernames, fmt.Sprintf("%s%s%d",
121+
orgName, userBaseName, j))
122+
}
123+
// add an admin user
124+
usernames = append(usernames, fmt.Sprintf("%s%s",
125+
orgName, adminBaseName))
126+
generateNodes(usersDir, usernames, rootCA)
127+
128+
// copy the admin cert to the org's MSP admincerts
129+
adminUserName := fmt.Sprintf("%s%s",
130+
orgName, adminBaseName)
131+
err = copyAdminCert(usersDir, adminCertsDir, adminUserName)
132+
if err != nil {
133+
fmt.Printf("Error copying admin cert for org %s:\n%v\n",
134+
orgName, err)
135+
os.Exit(1)
136+
}
137+
109138
}
110139
}
111140

141+
func copyAdminCert(usersDir, adminCertsDir, adminUserName string) error {
142+
// delete the contents of admincerts
143+
err := os.RemoveAll(adminCertsDir)
144+
if err != nil {
145+
return err
146+
}
147+
// recreate the admincerts directory
148+
err = os.MkdirAll(adminCertsDir, 0755)
149+
if err != nil {
150+
return err
151+
}
152+
err = copyFile(filepath.Join(usersDir, adminUserName, "signcerts",
153+
adminUserName+"-cert.pem"), filepath.Join(adminCertsDir,
154+
adminUserName+"-cert.pem"))
155+
if err != nil {
156+
return err
157+
}
158+
return nil
159+
160+
}
161+
112162
func generateNodes(baseDir string, nodeNames []string, rootCA *ca.CA) {
113163

114164
for _, nodeName := range nodeNames {
@@ -129,6 +179,8 @@ func generateOrdererOrg(baseDir, orgName string) {
129179
caDir := filepath.Join(orgDir, "ca")
130180
mspDir := filepath.Join(orgDir, "msp")
131181
orderersDir := filepath.Join(orgDir, "orderers")
182+
usersDir := filepath.Join(orgDir, "users")
183+
adminCertsDir := filepath.Join(mspDir, "admincerts")
132184
rootCA, err := ca.NewCA(caDir, orgName)
133185
if err != nil {
134186
fmt.Printf("Error generating CA for org %s:\n%v\n", orgName, err)
@@ -149,4 +201,40 @@ func generateOrdererOrg(baseDir, orgName string) {
149201
}
150202
generateNodes(orderersDir, ordererNames, rootCA)
151203

204+
// generate an admin for the orderer org
205+
usernames := []string{}
206+
// add an admin user
207+
usernames = append(usernames, fmt.Sprintf("%s%s",
208+
orgName, adminBaseName))
209+
generateNodes(usersDir, usernames, rootCA)
210+
211+
// copy the admin cert to the org's MSP admincerts
212+
adminUserName := fmt.Sprintf("%s%s",
213+
orgName, adminBaseName)
214+
err = copyAdminCert(usersDir, adminCertsDir, adminUserName)
215+
if err != nil {
216+
fmt.Printf("Error copying admin cert for org %s:\n%v\n",
217+
orgName, err)
218+
os.Exit(1)
219+
}
220+
221+
}
222+
223+
func copyFile(src, dst string) error {
224+
in, err := os.Open(src)
225+
if err != nil {
226+
return err
227+
}
228+
defer in.Close()
229+
out, err := os.Create(dst)
230+
if err != nil {
231+
return err
232+
}
233+
defer out.Close()
234+
_, err = io.Copy(out, in)
235+
cerr := out.Close()
236+
if err != nil {
237+
return err
238+
}
239+
return cerr
152240
}

0 commit comments

Comments
 (0)