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 条目。

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.

因此,我通常做的只是创建一个最小的配置文件,然后在 运行 宁 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