Hyperledger Fabric CA:通过 ENV 覆盖证书签名请求 (CSR) 部分
Hyperledger Facric CA: Override Certificate Signing Request (CSR) section by ENV
我想通过变量 env 覆盖 fabric-ca-server-config.yaml 文件的这一部分:
csr:
cn: fabric-ca-server
names:
- C: US
ST: "North Carolina"
L:
O: Hyperledger
OU: Fabric
hosts:
- host1.example.com
- localhost
ca:
expiry: 131400h
pathlength: 1
例如我知道:
FABRIC_CA_SERVER_CSR_CN=fabric-ca-server
等价于 csr.cn
但
csr.names??
csr.host??
难道是:
FABRIC_CA_SERVER_CSR_NAMES=C:US,ST:"North Carolina",L:,O:Hyperledger,OU:Fabric
此致
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) 但是,环境变量 can only be strings,因此似乎无法使用环境变量覆盖配置 CSR 设置。 FABRIC_CA_SERVER_CSR_NAMES_OU
之类的内容将不起作用,因为 names:
是一个地图,因此可能有多个 OU
条目。
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.
因此,我通常做的只是创建一个最小的配置文件,然后在 运行 宁 init
之前将其复制到 CA 容器中。这似乎就足够了(其他部分采用默认值):
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:
部分,它不会注册 bootstrap 用户,即使您使用命令行 -b
选项。因此,如果您包含 registry:
部分,那么当您 运行 init
.
时就不需要 -b
选项
您可能还想包括 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:
此外,在 运行ning 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
我想通过变量 env 覆盖 fabric-ca-server-config.yaml 文件的这一部分:
csr:
cn: fabric-ca-server
names:
- C: US
ST: "North Carolina"
L:
O: Hyperledger
OU: Fabric
hosts:
- host1.example.com
- localhost
ca:
expiry: 131400h
pathlength: 1
例如我知道:
FABRIC_CA_SERVER_CSR_CN=fabric-ca-server
等价于 csr.cn
但
csr.names??
csr.host??
难道是:
FABRIC_CA_SERVER_CSR_NAMES=C:US,ST:"North Carolina",L:,O:Hyperledger,OU:Fabric
此致
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) 但是,环境变量 can only be strings,因此似乎无法使用环境变量覆盖配置 CSR 设置。 FABRIC_CA_SERVER_CSR_NAMES_OU
之类的内容将不起作用,因为 names:
是一个地图,因此可能有多个 OU
条目。
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.
因此,我通常做的只是创建一个最小的配置文件,然后在 运行 宁 init
之前将其复制到 CA 容器中。这似乎就足够了(其他部分采用默认值):
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:
部分,它不会注册 bootstrap 用户,即使您使用命令行 -b
选项。因此,如果您包含 registry:
部分,那么当您 运行 init
.
-b
选项
您可能还想包括 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:
此外,在 运行ning 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