TL;DR:你不能用 env 覆盖 CSR。变量,但您可以在配置文件中自定义 CSR。
长答案:
这里有两个问题:
1)您收到的错误表明配置正在寻找地图(这是它在fabric-ca-server-config.yaml
文件中的格式)。
要在 bash 脚本变量中创建映射,您需要声明关联数组:
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) 但是,环境变量只能是字符串,因此似乎无法用环境变量覆盖配置 CSR 设置。像这样的东西FABRIC_CA_SERVER_CSR_NAMES_OU
不起作用,因为names:
是一张地图,所以可能有多个OU
条目。
文档状态:
如果需要自定义CSR的值,可以自定义配置文件,删除ca.certfile和ca.keyfile配置项指定的文件,然后再次运行fabric-ca-server init -b admin:adminpw命令。
所以,我通常做的只是创建一个最小的配置文件并在运行之前将它复制到 CA 容器中init
。这似乎就足够了(其他部分采用默认值):
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
出于某种原因,如果您包含自定义fabric-ca-server-config.yaml
文件但排除该registry:
部分,则即使您使用命令行-b
选项,它也不会注册引导用户。因此,如果包含该registry:
部分,则在运行时不需要该-b
选项init
。
您可能还希望包含该ca:
部分,因为您可以强制将创建的证书保存为您的自定义名称:
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:
此外,在运行之前,init
我会清理您的主目录 - 有时默认ca-cert.pem
(和密钥)已经存在并且不会被替换:
rm $FABRIC_CA_SERVER_HOME/ca-cert.pem
rm -R $FABRIC_CA_SERVER_HOME/msp
当然,运行后init
你的密钥会保存在msp
目录树下:
msp
└── keystore
├── {...}_sk
我通常将其移动到主目录并为方便起见重命名:
cp $FABRIC_CA_SERVER_HOME/msp/keystore/*_sk $FABRIC_CA_SERVER_HOME/mycompany-ca-cert.key