Openssl 结构链码-与Vault通信

Openssl 结构链码-与Vault通信,openssl,hyperledger-fabric,hyperledger,hyperledger-chaincode,hyperledger-fabric-ca,Openssl,Hyperledger Fabric,Hyperledger,Hyperledger Chaincode,Hyperledger Fabric Ca,我需要以某种方式与某个链码中的Vault实例通信 我的问题是,我需要Vault上的(相互)TLS,因此为了使链码与之通信,它需要由适当的CA颁发适当的证书 安装链码的对等方和Vault实例都使用相同的根CA 那么,如何在链码中获取适当的证书,并将其用于向Vault实例发出的请求 如果它在某种程度上有帮助: 发出请求时从链码容器中记录: 2021-01-21T14:18:29.847Z error [c-api:_]

我需要以某种方式与某个链码中的Vault实例通信

我的问题是,我需要Vault上的(相互)TLS,因此为了使链码与之通信,它需要由适当的CA颁发适当的证书

安装链码的对等方和Vault实例都使用相同的根CA

那么,如何在链码中获取适当的证书,并将其用于向Vault实例发出的请求

如果它在某种程度上有帮助:

发出请求时从链码容器中记录:

2021-01-21T14:18:29.847Z error [c-api:_]                                          Unhandled Rejection reason RequestError: Error: unable to verify the first certificate promise Promise {
  <rejected> RequestError: Error: unable to verify the first certificate
      at new RequestError (/usr/local/src/node_modules/request-promise-core/lib/errors.js:14:15)
      at Request.plumbing.callback (/usr/local/src/node_modules/request-promise-core/lib/plumbing.js:87:29)
      at Request.RP$callback [as _callback] (/usr/local/src/node_modules/request-promise-core/lib/plumbing.js:46:31)
      at self.callback (/usr/local/src/node_modules/request/request.js:185:22)
      at Request.emit (events.js:311:20)
      at Request.onRequestError (/usr/local/src/node_modules/request/request.js:881:8)
      at ClientRequest.emit (events.js:311:20)
      at TLSSocket.socketErrorListener (_http_client.js:426:9)
      at TLSSocket.emit (events.js:311:20)
      at emitErrorNT (internal/streams/destroy.js:92:8) {
    name: 'RequestError',
    message: 'Error: unable to verify the first certificate',
    cause: Error: unable to verify the first certificate
        at TLSSocket.onConnectSecure (_tls_wrap.js:1473:34)
        at TLSSocket.emit (events.js:311:20)
        at TLSSocket._finishInit (_tls_wrap.js:916:8)
        at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:686:12) {
      code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'
    },
    error: Error: unable to verify the first certificate
        at TLSSocket.onConnectSecure (_tls_wrap.js:1473:34)
        at TLSSocket.emit (events.js:311:20)
        at TLSSocket._finishInit (_tls_wrap.js:916:8)
        at TLSWrap.ssl.onhandshakedone (_tls_wrap.js:686:12) {
      code: 'UNABLE_TO_VERIFY_LEAF_SIGNATURE'
    },
    options: {
      json: [Object],
      resolveWithFullResponse: true,
      simple: false,
      strictSSL: true,
      method: 'PUT',
      path: '/sys/unseal',
      headers: [Object],
      uri: 'https://vaultinstance.com:8200/v1/sys/unseal',
      callback: [Function: RP$callback],
      transform: undefined,
      transform2xxOnly: false
    },
    response: undefined
  }
}  
2021-01-21T14:20:59.784Z [INFO]  http: TLS handshake error from 192.168.224.1:51074: remote error: tls: unknown certificate

在安装时无法向chaincode提供机密配置信息,因此除非您在chaincode包中包含证书,这可能是个坏主意,因此我认为您的chaincode将需要一个init事务来使用瞬态数据发送所需的证书

文档描述了如何要求初始化事务

如果您使用的是Fabric peer CLI,则可以使用--init required 批准和提交链码定义时进行标记,以指示 必须调用Init函数来初始化新的链码 版本要使用Fabric对等CLI调用Init,请使用对等CLI chaincode调用命令并传递--isInit标志

描述了初始化链码时如何保护TLS证书


或者,如果您不想使用init事务或将TLS证书存储在分类账/私人数据收集中,您可以使用瞬态数据向需要与vault通信的每个事务提供TLS证书,并将其留给客户端来管理证书。

我想到的一个解决方案是实际进行一些“注册”然后将生成的证书和密钥文件作为私有数据保存。这样做的一个优点是,我可以轻松地“刷新”/撤销证书。但我真的不喜欢这个想法,因为我的链码需要获取很多节点模块。现在我正在试着看看我是否能从链码的环境(CORE\u PEER\u TLS\u ROOTCERT\u文件等)中获得证书,因为如果我能做到这一点,那么问题就解决了。但我不太确定使用env是否好。变量。