3

我想通过变量 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

问候

4

1 回答 1

3

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
于 2018-10-03T16:57:34.747 回答