如何从hyperledger中的hfc-key-store中的真实fabric-ca-server证书派生证书?

Nik*_*ili 12 docker hyperledger hyperledger-fabric hyperledger-fabric-ca

我想首先正确解释我的理解,如果我是对的,请告诉我真相,如果我弄错了,请告诉我,我错了.我的解释是关于hyperledger网络和节点sdk如何协同工作以及节点sdk如何连接到超级网络.

开始吧.当我启动hyperledger网络时,它所做的是在端口7054上创建fabric-ca-server docker镜像和容器.在该端口上,它注册了一个用户"admin with the password:"adminpwd".这意味着还有证书制作对于这个用户.现在假设我想从节点sdk创建一个新用户.我想我需要做的是为管理员提供证书,以便我可以签署我的请求,网络知道我是管理员和部分网络.代码的作用是第一次写入getUserContext("admin"),如果找不到,那么它会尝试使用用户名和密码(admin和adminpwd)注册.我的理解是getUserContext转到hfc-key -store文件夹并尝试查找admin的证书.如果找不到它,会发生注册然后发生createUser函数,它将从fabric-ca-server docker映像派生的证书放入hfc-key-store,这样当管理员再次尝试注册时,它不必转到fabric-ca-server docker 图片.我到目前为止对吗?我现在就问我的问题.

问题:

  1. 据我所知,在尝试注册时,它无法从fabric-ca-server docker镜像获取管理员的原始证书,因为如果它被盗,整个网络都会被搞砸.所以它所做的是从原始的那个获得某种公共/私人和证书与我可以进行其他操作.问题是:如果有人偷了我的hfc-key-store文件夹,其中有管理员证书.他可以在没有注册的情况下进行操作,因为getUserContext("admin")将返回true并且它会让它做任何事情.如果有人偷了那个文件夹怎么办?这不危险吗?

  2. 我不明白getUserContext()和setUserContext()以及createUser()函数的含义.如果你能做到,只要用一种非常易于理解的语言来描述它们,因为我已经很长一段时间试图绕过这个但没有运气.为什么我们需要这些功能,它们对我们的帮助等等.

  3. 为什么cryptogen工具不用于生产,而fabric-ca-server可用于生产?

zha*_*chy 12

那里似乎有很多问题.让我一步一步解释.如果出现问题或不清楚,请发表意见.

Fabric被设计为一种Consortium Blockchain System并广泛用于企业业务场景.在Fabric业务网络中,每个组织通常包含至少一个对等体,并且可选择一个对等体.

想想这样的商业场景.有几家公司希望一起做生意.但是,他们不够相互信任.所以他们决定用Fabric来解决他们的痛点.假设该网络包含3个公司(组织),每个公司(组织)有一个同行和一个ca.

现在业务网络已经设置好了.

首先,让我解释一下入学的概念.

  1. 每个org的ca都有一个bootstrap用户,这来自用户名和密码,通常样本会使用admin/adminpw.在ca服务器设置期间,此引导用户正在写入CA的数据库.设置后,引导用户已注册.但没有注册.
  2. 接下来是enroll the bootstrap user.在这一步中,fabric-sdk(稍后我将使用sdk)将首先生成私钥/公钥对,然后生成csr(证书签名请求),最后使用私钥签署csr并发送签名的csr到fabric-ca服务器.
  3. 当fabric-ca服务器收到签名的csr时.它为该用户生成证书.证书包含用户的公钥.Fabric-ca将使用其私钥对此请求进行签名,并在证书上附加其签名.
  4. sdk从fabric-ca服务器获得响应(来自3的证书).fabric-sdk将证书和用户的私钥放在一起(我们称之为注册)作为方法的响应enroll().
  5. 现在,引导程序用户已注册,并可使用此注册访问结构网络.

我们可以使用bootstrap用户在此组织中注册和注册新用户.这就是我们将财团区块链系统称为许可区块链系统的原因.

其次,让我解释一下sdk KVS(键值存储)的概念.

我们已经从上面的步骤获得了用户的privateKey和证书.那么我们如何坚持这些数据呢?有几种选择,将其存储在应用层数据库,一些硬件加密钱包,一些基于云的HSM等.

Fabric-sdk提供了一个KVS来做到这一点.这是一个可选选项,您可以选择是否使用它.坦率地说,我不建议在生产系统中使用它.如果你只想尝试某些东西或测试一些东西,这很好,因为它非常简单.

默认情况下,fabirc-sdk-node将使用文件系统KVS.它将凭据存储在磁盘中,这就是你提到的hfc-key-store文件夹.

那么如果KVS被盗会怎么样?

所有注册都被盗了.所有证书和私人钥匙都被盗了.攻击者可以使用这些证书和privateKeys使用这些证书中的标识访问区块链系统.这是一场灾难.

createUser()用于什么?

而不是将这些注册存储在文件系统中.将其存储在Application层数据库中的更好选择.每次我们想要访问区块链系统时,我们都可以先从db查询并获取证书和privateKey.然后使用该createUser()界面创建一个新的User实例.此用户实例用作访问区块链系统的标识.

最后,让我解释一下Fabric中的事务流程

我们没有有效的用户证书和privateKey.我们如何向Fabric网络发送交易?fabric-peer如何验证交易并知道我是谁?

  1. 每个事务都包含用户的标识.如果您想通过提交交易userA,那么您应该setUserContext(userA)在进一步支持电话之前致电.
  2. 事务提议在消息头中包含用户的证书.在将事务发送到fabric-peer之前,sdk将使用当前用户的私钥来签署此事务提议.
  3. 在同行方面.当对等体收到endorse请求时,对等体将使用fabric-ca的根证书来验证该请求中的证书,以便对等体知道该请求来自已知CA发出的身份,现在证书是可信的.然后对等体将解析证书并获取身份的公钥,然后使用此公钥验证事务的签名(我在上面描述了tx由私钥签名,现在由公钥验证),现在交易是可信的.

从事务流程中,我们了解到必须使用用户的证书发送事务并使用用户的私钥进行签名.这就是我们setUserContext()在fabirc-sdk 设计界面的原因.

加密工具

此工具用于在系统设置时生成私钥/公钥对以及相应的证书.之后,我们需要一个动态的添加/删除身份机制.而解决方案是Fabric-ca.

注意,fabric-ca是可选的,您可以使用任何其他CA.


Gar*_*ngh 9

你的问题有很多部分; 我会尝试从顶部开始.

  1. 为了运行/操作Fabric对等体或orderer节点,不需要Fabric CA. 默认安全机制基于使用椭圆曲线的标准X509 PKI(默认为p256).您可以使用您希望以任何方式颁发的X509证书.Fabric CA作为一种这样的实现提供.

  2. Fabric CA有多个API,但主要有两个是Register和Enroll.注册是颁发X509证书的过程.您必须先注册用户/节点,然后才能注册它们.当Fabric CA首次启动时,您必须创建"bootstrap"管理员用户.此用户在启动时自动注册但尚未注册.您通过生成私钥和证书签名请求来注册Fabric CA,并使用注册ID和密钥提交.如果成功,则会收到Fabric CA签署的X509证书.

  3. 为方便起见,Fabric Node SDK提供了一个fabric-ca-client软件包,它提供了使用Fabric CA注册和注册用户的包装API.这允许您从Fabric CA获取和使用凭据

  4. 但是,fabric-client软件包不需要您从Fabric CA获取凭据.您可能拥有自己的私钥和X509证书,该证书由其他某些机构颁发(甚至由cryptogen生成).

  5. fabric-client提供了一个"可插拔"密钥存储区,用于存储凭据.默认值是基于文件的密钥库.

  6. 在内部,fabric-client实际上使用User类来表示当前用户.这很重要,因为有几种方法可以填充此结构:

  7. 一旦有了User对象,就需要告诉fabric-client使用它.这是你使用的地方Client.setUserContext().您传入了该User对象,默认情况下将保留该对象.
  8. 然后,您可以Client.getUserContext()在启动客户端应用程序时使用- 从配置的密钥库加载用户信息 - 以用于将来的请求.

至于你的问题cryptogen,你没有理由不能在生产中使用生成的加密材料...它只是它是一个真正旨在帮助开发和测试以引导网络的工具.它不是PKI基础架构,也不包括证书撤销等内容.

希望这可以帮助.