Skip to content

Commit

Permalink
Enhancements for cryptogen
Browse files Browse the repository at this point in the history
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 <gari.r.singh@gmail.com>
  • Loading branch information
mastersingh24 committed Mar 17, 2017
1 parent a71af56 commit dfc3077
Show file tree
Hide file tree
Showing 2 changed files with 90 additions and 2 deletions.
2 changes: 1 addition & 1 deletion common/tools/cryptogen/ca/generator.go
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ func NewCA(baseDir, name string) (*CA, error) {
//this is a CA
template.IsCA = true
template.KeyUsage |= x509.KeyUsageCertSign | x509.KeyUsageCRLSign
template.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageAny}
template.ExtKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageAny, x509.ExtKeyUsageServerAuth}

//set the organization for the subject
subject := subjectTemplate()
Expand Down
90 changes: 89 additions & 1 deletion common/tools/cryptogen/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package main
import (
"flag"
"fmt"
"io"
"os"
"path/filepath"

Expand All @@ -28,8 +29,10 @@ import (
const (
peerOrgBaseName = "peerOrg"
peerBaseName = "Peer"
userBaseName = "User"
adminBaseName = "Admin"
orderOrgBaseName = "ordererOrg"
ordererBaseName = "orderer"
ordererBaseName = "Orderer"
)

//command line flags
Expand All @@ -38,6 +41,8 @@ var (
"number of unique organizations with peers")
numPeers = flag.Int("peersPerOrg", 1,
"number of peers per organization")
numPeerOrgUsers = flag.Int("peerOrgUsers", 1,
"number of users per peer organization")
numOrderers = flag.Int("ordererNodes", 1,
"number of ordering service nodes")
baseDir = flag.String("baseDir", ".",
Expand Down Expand Up @@ -87,6 +92,8 @@ func generatePeerOrgs(baseDir string, orgNames []string) {
caDir := filepath.Join(orgDir, "ca")
mspDir := filepath.Join(orgDir, "msp")
peersDir := filepath.Join(orgDir, "peers")
usersDir := filepath.Join(orgDir, "users")
adminCertsDir := filepath.Join(mspDir, "admincerts")
rootCA, err := ca.NewCA(caDir, orgName)
if err != nil {
fmt.Printf("Error generating CA for org %s:\n%v\n", orgName, err)
Expand All @@ -106,9 +113,52 @@ func generatePeerOrgs(baseDir string, orgNames []string) {
orgName, peerBaseName, i))
}
generateNodes(peersDir, peerNames, rootCA)

// TODO: add ability to specify usernames
usernames := []string{}
for j := 1; j <= *numPeerOrgUsers; j++ {
usernames = append(usernames, fmt.Sprintf("%s%s%d",
orgName, userBaseName, j))
}
// add an admin user
usernames = append(usernames, fmt.Sprintf("%s%s",
orgName, adminBaseName))
generateNodes(usersDir, usernames, rootCA)

// copy the admin cert to the org's MSP admincerts
adminUserName := fmt.Sprintf("%s%s",
orgName, adminBaseName)
err = copyAdminCert(usersDir, adminCertsDir, adminUserName)
if err != nil {
fmt.Printf("Error copying admin cert for org %s:\n%v\n",
orgName, err)
os.Exit(1)
}

}
}

func copyAdminCert(usersDir, adminCertsDir, adminUserName string) error {
// delete the contents of admincerts
err := os.RemoveAll(adminCertsDir)
if err != nil {
return err
}
// recreate the admincerts directory
err = os.MkdirAll(adminCertsDir, 0755)
if err != nil {
return err
}
err = copyFile(filepath.Join(usersDir, adminUserName, "signcerts",
adminUserName+"-cert.pem"), filepath.Join(adminCertsDir,
adminUserName+"-cert.pem"))
if err != nil {
return err
}
return nil

}

func generateNodes(baseDir string, nodeNames []string, rootCA *ca.CA) {

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

// generate an admin for the orderer org
usernames := []string{}
// add an admin user
usernames = append(usernames, fmt.Sprintf("%s%s",
orgName, adminBaseName))
generateNodes(usersDir, usernames, rootCA)

// copy the admin cert to the org's MSP admincerts
adminUserName := fmt.Sprintf("%s%s",
orgName, adminBaseName)
err = copyAdminCert(usersDir, adminCertsDir, adminUserName)
if err != nil {
fmt.Printf("Error copying admin cert for org %s:\n%v\n",
orgName, err)
os.Exit(1)
}

}

func copyFile(src, dst string) error {
in, err := os.Open(src)
if err != nil {
return err
}
defer in.Close()
out, err := os.Create(dst)
if err != nil {
return err
}
defer out.Close()
_, err = io.Copy(out, in)
cerr := out.Close()
if err != nil {
return err
}
return cerr
}

0 comments on commit dfc3077

Please sign in to comment.