【问题标题】:Hyperledger Fabric - external chaincode with TLS from fabric-caHyperledger Fabric - 来自 fabric-ca 的带有 TLS 的外部链码
【发布时间】:2021-08-10 21:46:30
【问题描述】:

我正在尝试使用新的外部链码服务功能设置 Hyperledger Fabric。使用默认配置(无 tls 或对等身份验证)运行链代码按预期工作。

我已经阅读了很多关于这个主题的教程,但是它们都只使用自签名证书来达到这个目的——这并不是很有帮助,因为我正在配置一个生产系统。我想使用已经在我的网络中运行的证书颁发机构(fabric-ca-server)并为我的订购者、同行等提供证书。

我的问题是:如何使用现有的 CA 生成 root_cert 以及 client_cert 和 client_key?必须有一种方法可以使用fabric-ca-client 来做到这一点。我已经尝试使用我的同行组织的 ca 证书,但这不起作用(它似乎不包含链码服务的主机名)。

感谢您的帮助。

更新

我现在尝试使用fabric-ca-client 的register 和enroll 命令来注册一个身份并为自己获取一个tls Enrollment-profile。

fabric-ca-client register --caname $CANAME --id.name chaincode --id.secret chainpw --tls.certfiles $certfile --loglevel error
fabric-ca-client enroll -u https://chaincode: chainpw@$CA_HOST_ADDRESS:$nodePort --caname $CANAME -M "$chainDir/msp" --csr.cn diplom-$validK8SHostName  --csr.hosts diplom-$validK8SHostName --tls.certfiles $certfile --loglevel error
fabric-ca-client enroll -u https://chaincode: chainpw@$CA_HOST_ADDRESS:$nodePort --caname $CANAME -M "$chainDir/tls" --enrollment.profile tls --csr.hosts diplom-$validK8SHostName --csr.hosts localhost --tls.certfiles $certfile --loglevel error

从生成的 tls 目录中,我将/signcerts/cert.pem 并通过awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' ... 将其格式化为单行,并将其作为root_cert 粘贴到connection.json 中。

同样,我已将 cert.pem 文件复制到链码容器中,并将环境变量 CORE_CHAINCODE_TLS_CLIENT_CACERT_FILE 设置为指向该文件。但是,peer 仍然无法连接到容器。

ClientHandshake -> ERRO 06c Client TLS handshake failed after 752.754µs with error: tls: first record does not look like a TLS handshake

更新 2

好像我在链码服务上设置了错误的环境变量。 CORE_CHAINCODE_TLS_CERT_FILE 必须设置为生成的/signcerts/cert.pemCORE_CHAINCODE_TLS_KEY_FILE 设置为来自/keystore 的私钥。

chaincode 服务现在似乎接受了证书,但对等方抱怨它们是由未知机构签署的。

更新 3

又一个进步。好像我在fabric-ca-client 命令中犯了一个错误。我不小心设置了 csr.cn 参数,从而覆盖了我的 CA 主机名。随着他的关注,我能够向我的 CA 注册我的链码服务,并获得相应的 TLS 证书以对我的服务有效并与组织 CA 结帐:-)

fabric-ca-client register --caname $CANAME --id.name $NAME --id.secret $PW --tls.certfiles $certfile --loglevel error
fabric-ca-client enroll -u https://$NAME:$PW@$CA_HOST_ADDRESS:$nodePort --caname $CANAME -M "$chainDir/msp" --csr.hosts chain-$validK8SHostName --tls.certfiles $certfile --loglevel error
fabric-ca-client enroll -u https://$NAME:$PW@$CA_HOST_ADDRESS:$nodePort --caname $CANAME -M "$chainDir/tls" --enrollment.profile tls --csr.hosts chain-$validK8SHostName --csr.hosts localhost --tls.certfiles $certfile --loglevel error

【问题讨论】:

    标签: ssl hyperledger-fabric hyperledger hyperledger-chaincode hyperledger-fabric-ca


    【解决方案1】:

    有关更多信息,https://github.com/hyperledgendary/contract-as-a-service 是一个将链代码显示为外部服务的示例存储库。

    那里采用的方法确实是 Victor 上面所描述的,AFAIK 是一种很好的方法。

    【讨论】:

      【解决方案2】:

      initializing a CA server 上的 Fabric CA 文档提到:

      fabric-ca-server init 命令生成自签名 CA 证书,除非 -u <parent-fabric-ca-server-URL> 选项是 指定的。如果指定了-u,则服务器的 CA 证书为 由父 Fabric CA 服务器签名。为了向 父 Fabric CA 服务器,URL 必须为 <scheme>://<enrollmentID>:<secret>@<host>:<port>,其中<enrollmentID><secret> 对应于具有hf.IntermediateCA 的身份 值等于true的属性。

      上面还说你可以设置一个已经生成的密钥和证书文件

      如果您希望 Fabric CA 服务器使用 CA 签名证书并且 您提供的密钥文件,您必须将文件放在该位置 分别由ca.certfileca.keyfile 引用。两个文件都必须 采用 PEM 编码,不得加密。更具体地说, CA 证书文件的内容必须以-----BEGIN CERTIFICATE----- 开头,并且密钥文件的内容必须以 -----BEGIN PRIVATE KEY----- 而不是 -----BEGIN ENCRYPTED PRIVATE KEY-----

      因此,如果您已经在运行一个 CA 服务器,则应该可以获取由它签名的证书或创建一个证书并将其包含在您的子 CA 中

      【讨论】:

      • 感谢您的回答。然而,这不是我想要达到的目标。 CA 服务器已启动并正在运行(每个组织一个以及订购者一个)。我不想将 ca-server 配置为中间 ca。我要做的是从现有组织 CA 获取 TLS 证书以及可用于外部链码服务的密钥对:-)
      【解决方案3】:

      我终于找到了问题的答案。正如我在第三次更新中所述,我使用 fabric-ca-client 为我的链码服务注册了一个身份。

      fabric-ca-client register --caname $CANAME --id.name $NAME --id.secret $PW --tls.certfiles $certfile --loglevel error
      fabric-ca-client enroll -u https://$NAME:$PW@$CA_HOST_ADDRESS:$nodePort --caname $CANAME -M "$chainDir/msp" --csr.hosts chain-$validK8SHostName --tls.certfiles $certfile --loglevel error
      fabric-ca-client enroll -u https://$NAME:$PW@$CA_HOST_ADDRESS:$nodePort --caname $CANAME -M "$chainDir/tls" --enrollment.profile tls --csr.hosts chain-$validK8SHostName --csr.hosts localhost --tls.certfiles $certfile --loglevel error
      

      请注意,validK8SHostName 只是我的容器的主机名,其中的点被破折号代替(k8s 不允许在服务或容器名称中使用点)。

      这些命令在我的chaindDir 中生成msptls 文件夹。引用为 JSON 属性的证书/密钥使用 awk 'NF {sub(/\r/, ""); printf "%s\\n",$0;}' 转换为单行。链码容器的环境变量是实际的文件(我已将它们作为机密挂载在我的 k8s 集群中)。

      • tls/signcerts ->“root_cert”属性和 CORE_CHAINCODE_TLS_CERT_FILE 环境需要认证。
      • tls/keystore -> 为 CORE_CHAINCODE_TLS_KEY_FILE 环境设置的私钥。
      • tls/tlscacerts -> CORE_CHAINCODE_TLS_CLIENT_CA_CERT_FILE 环境需要证书。
      • msp/signcert -> “client_cert”属性需要证书。
      • msp/keystore -> 为“client_key”属性设置的私钥

      通过设置,我可以启动 TLS 终止的链码容器,并且只与那些具有相应证书和私钥组合的对等方通信。因此,所有证书和密钥都是由我的组织 CA 生成的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多