TL;DR: You can't override the CSR with env. variables, but you can customize the CSR in the config file.
Long answer:
There are two issues going on here:
1) The error you are getting states that the configuration is looking for a map (which is how it is formatted in the fabric-ca-server-config.yaml file).
To create a map in a bash script variable, you need to declare the associative array:
declare -A FABRIC_CA_SERVER_CSR_NAMES=( \
[C]="US" \
[ST]="Texas" \
[L]="" \
[O]="TangoJLabs" \
[OU]="testenvvar" \
)
export FABRIC_CA_SERVER_CSR_NAMES
echo ${FABRIC_CA_SERVER_CSR_NAMES[OU]}
2) However, environment variables can only be strings, so it does not appear possible to override the configuration CSR settings with environment variables. Something like FABRIC_CA_SERVER_CSR_NAMES_OU will not work because names: is a map, so there could be multiple OU entries.
The docs state:
If custom values for the CSR are required, you may customize the
configuration file, delete the files specified by the ca.certfile and
ca.keyfile configuration items, and then run the fabric-ca-server init
-b admin:adminpw command again.
So, what I typically do is just create a minimal config file and copy it over to the CA container before running init. This seems to be enough (with the other sections taking default values):
registry:
maxenrollments: -1
identities:
- name: mycompany-admin-ca
pass: adminpw
type: client
affiliation: ""
attrs:
hf.Registrar.Roles: "*"
hf.Registrar.DelegateRoles: "*"
hf.Revoker: true
hf.IntermediateCA: true
hf.GenCRL: true
hf.Registrar.Attributes: "*"
hf.AffiliationMgr: true
affiliations:
mycompany: []
csr:
cn: mycompany-ca
names:
- C: US
ST: Texas
L:
O: MyCompany
OU: client
hosts:
- mycompany-ca
ca:
expiry: 131400h
pathlength: 1
For some reason, if you include a custom fabric-ca-server-config.yaml file but exclude the registry: section, it does not register a bootstrap user, even if you use the command line -b option. So, if you include that registry: section, you therefore don't need the -b option when you run init.
You might also want to include the ca: section since you can force the created certificate to be saved to your custom name:
ca:
name: mycompany-ca
keyfile: /etc/hyperledger/fabric-ca-server/mycompany-ca-cert.key
certfile: /etc/hyperledger/fabric-ca-server/mycompany-ca-cert.pem
chainfile:
Also, before running init I would clean up your home directory - sometimes the default ca-cert.pem (and key) already exist and are not replaced:
rm $FABRIC_CA_SERVER_HOME/ca-cert.pem
rm -R $FABRIC_CA_SERVER_HOME/msp
Of course, after running init your key will be saved in the msp directory tree under:
msp
└── keystore
├── {...}_sk
I typically move it to the home directory and rename it for convenience:
cp $FABRIC_CA_SERVER_HOME/msp/keystore/*_sk $FABRIC_CA_SERVER_HOME/mycompany-ca-cert.key