Skip to content

Commit cef4f79

Browse files
committed
[FAB-3455] cryptogen: Use a FQDN for CA artifacts
This patch does two primary things: 1) It formulates a real CN for the CA rather than assigning it the same name as the organiazation. E.g. "ca.example.com" rather than "example.com" 2) It adds the ability to override the default ("ca.{{ .Domain }}") using the template system. Fixes FAB-3455 Change-Id: I5c8085e338b5d11e236d517e275a817eb89760a5 Signed-off-by: Greg Haskins <[email protected]>
1 parent 0d8c255 commit cef4f79

File tree

4 files changed

+41
-16
lines changed

4 files changed

+41
-16
lines changed

common/tools/cryptogen/ca/ca_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ var testDir = filepath.Join(os.TempDir(), "ca-test")
3838
func TestNewCA(t *testing.T) {
3939

4040
caDir := filepath.Join(testDir, "ca")
41-
rootCA, err := ca.NewCA(caDir, testCAName)
41+
rootCA, err := ca.NewCA(caDir, testCAName, testCAName)
4242
assert.NoError(t, err, "Error generating CA")
4343
assert.NotNil(t, rootCA, "Failed to return CA")
4444
assert.NotNil(t, rootCA.Signer,
@@ -68,7 +68,7 @@ func TestGenerateSignCertificate(t *testing.T) {
6868
assert.NotNil(t, ecPubKey, "Failed to generate signed certificate")
6969

7070
// create our CA
71-
rootCA, err := ca.NewCA(caDir, testCA2Name)
71+
rootCA, err := ca.NewCA(caDir, testCA2Name, testCA2Name)
7272
assert.NoError(t, err, "Error generating CA")
7373

7474
_, err = rootCA.SignCertificate(certDir, testName, ecPubKey)

common/tools/cryptogen/ca/generator.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ type CA struct {
4040

4141
// NewCA creates an instance of CA and saves the signing key pair in
4242
// baseDir/name
43-
func NewCA(baseDir, name string) (*CA, error) {
43+
func NewCA(baseDir, org, name string) (*CA, error) {
4444

4545
var response error
4646
var ca *CA
@@ -62,7 +62,7 @@ func NewCA(baseDir, name string) (*CA, error) {
6262

6363
//set the organization for the subject
6464
subject := subjectTemplate()
65-
subject.Organization = []string{name}
65+
subject.Organization = []string{org}
6666
subject.CommonName = name
6767

6868
template.Subject = subject

common/tools/cryptogen/main.go

+33-9
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ type UsersSpec struct {
7070
type OrgSpec struct {
7171
Name string `yaml:"Name"`
7272
Domain string `yaml:"Domain"`
73+
CA NodeSpec `yaml:"CA"`
7374
Template NodeTemplate `yaml:"Template"`
7475
Specs []NodeSpec `yaml:"Specs"`
7576
Users UsersSpec `yaml:"Users"`
@@ -107,6 +108,15 @@ PeerOrgs:
107108
- Name: Org1
108109
Domain: org1.example.com
109110
111+
# ---------------------------------------------------------------------------
112+
# "CA"
113+
# ---------------------------------------------------------------------------
114+
# Uncomment this section to enable the explicit definition of the CA for this
115+
# organization. This entry is a Spec. See "Specs" section below for details.
116+
# ---------------------------------------------------------------------------
117+
# CA:
118+
# Hostname: ca # implicitly ca.org1.example.com
119+
110120
# ---------------------------------------------------------------------------
111121
# "Specs"
112122
# ---------------------------------------------------------------------------
@@ -263,6 +273,15 @@ func parseTemplate(input, defaultInput string, data interface{}) (string, error)
263273
return output.String(), nil
264274
}
265275

276+
func renderCN(domain string, spec NodeSpec) (string, error) {
277+
data := CommonNameData{
278+
Hostname: spec.Hostname,
279+
Domain: domain,
280+
}
281+
282+
return parseTemplate(spec.CommonName, defaultCNTemplate, data)
283+
}
284+
266285
func generateNodeSpec(orgSpec *OrgSpec, prefix string) error {
267286
// First process all of our templated nodes
268287
for i := 0; i < orgSpec.Template.Count; i++ {
@@ -281,21 +300,26 @@ func generateNodeSpec(orgSpec *OrgSpec, prefix string) error {
281300
orgSpec.Specs = append(orgSpec.Specs, spec)
282301
}
283302

284-
// And finally touch up all specs to add the domain
303+
// Touch up all general node-specs to add the domain
285304
for idx, spec := range orgSpec.Specs {
286-
data := CommonNameData{
287-
Hostname: spec.Hostname,
288-
Domain: orgSpec.Domain,
289-
}
290-
291-
finalCN, err := parseTemplate(spec.CommonName, defaultCNTemplate, data)
305+
finalCN, err := renderCN(orgSpec.Domain, spec)
292306
if err != nil {
293307
return err
294308
}
295309

296310
orgSpec.Specs[idx].CommonName = finalCN
297311
}
298312

313+
// Process the CA node-spec in the same manner
314+
if len(orgSpec.CA.Hostname) == 0 {
315+
orgSpec.CA.Hostname = "ca"
316+
}
317+
finalCN, err := renderCN(orgSpec.Domain, orgSpec.CA)
318+
if err != nil {
319+
return err
320+
}
321+
orgSpec.CA.CommonName = finalCN
322+
299323
return nil
300324
}
301325

@@ -311,7 +335,7 @@ func generatePeerOrg(baseDir string, orgSpec OrgSpec) {
311335
peersDir := filepath.Join(orgDir, "peers")
312336
usersDir := filepath.Join(orgDir, "users")
313337
adminCertsDir := filepath.Join(mspDir, "admincerts")
314-
rootCA, err := ca.NewCA(caDir, orgName)
338+
rootCA, err := ca.NewCA(caDir, orgName, orgSpec.CA.CommonName)
315339
if err != nil {
316340
fmt.Printf("Error generating CA for org %s:\n%v\n", orgName, err)
317341
os.Exit(1)
@@ -407,7 +431,7 @@ func generateOrdererOrg(baseDir string, orgSpec OrgSpec) {
407431
orderersDir := filepath.Join(orgDir, "orderers")
408432
usersDir := filepath.Join(orgDir, "users")
409433
adminCertsDir := filepath.Join(mspDir, "admincerts")
410-
rootCA, err := ca.NewCA(caDir, orgName)
434+
rootCA, err := ca.NewCA(caDir, orgName, orgSpec.CA.CommonName)
411435
if err != nil {
412436
fmt.Printf("Error generating CA for org %s:\n%v\n", orgName, err)
413437
os.Exit(1)

common/tools/cryptogen/msp/msp_test.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@ import (
2727
)
2828

2929
const (
30-
testCAName = "root0"
30+
testCAOrg = "example.com"
31+
testCAName = "ca" + "." + testCAOrg
3132
testName = "peer0"
3233
)
3334

@@ -42,7 +43,7 @@ func TestGenerateLocalMSP(t *testing.T) {
4243

4344
caDir := filepath.Join(testDir, "ca")
4445
mspDir := filepath.Join(testDir, "msp")
45-
rootCA, err := ca.NewCA(caDir, testCAName)
46+
rootCA, err := ca.NewCA(caDir, testCAOrg, testCAName)
4647
assert.NoError(t, err, "Error generating CA")
4748
err = msp.GenerateLocalMSP(testDir, testName, rootCA)
4849
assert.NoError(t, err, "Failed to generate local MSP")
@@ -80,7 +81,7 @@ func TestGenerateVerifyingMSP(t *testing.T) {
8081

8182
caDir := filepath.Join(testDir, "ca")
8283
mspDir := filepath.Join(testDir, "msp")
83-
rootCA, err := ca.NewCA(caDir, testCAName)
84+
rootCA, err := ca.NewCA(caDir, testCAOrg, testCAName)
8485
assert.NoError(t, err, "Failed to create new CA")
8586

8687
err = msp.GenerateVerifyingMSP(mspDir, rootCA)

0 commit comments

Comments
 (0)