首页 文章

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

提问于
浏览
6

我想首先正确解释一下我的理解,如果我是对的,请告诉我实话,如果我弄错了,请告诉我,我错了 . 我的解释是关于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图片 . 我到目前为止对吗?我现在就问我的问题 .

Questions :

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

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

  • 为什么 生产环境 中没有使用cryptogen工具,而 生产环境 中可以使用fabric-ca-server?

3 回答

  • 2

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

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

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

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

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

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

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

    • createUser() - 此功能允许您从预先存在的私人/公共(X509)密钥对创建用户

    • User.setEnrollment() - 这允许您直接向结构中添加所需信息...这通常与CertificateAuthority.enroll()的响应一起使用

    • 一旦有了 User 对象,就需要告诉fabric-client使用它 . 这是你使用Client.setUserContext()的地方 . 传入 User 对象,默认情况下会保留该对象 .

    • 然后,您可以使用Client.getUserContext()(它从已配置的密钥库加载用户信息),以便在启动客户端应用程序时将来的请求 .

    关于 cryptogen 的问题,'s no reason why you can' t使用生成的加密材料 生产环境 ...它's simply that it'是一个真正旨在帮助开发和测试以引导网络的工具 . 它不是PKI基础架构,也不包括证书撤销等内容 .

    希望这可以帮助 .

  • 4

    我喜欢你所有的问题,而且我最近在使用Node SDK for HLF时遇到了完全相同的问题 .

    我将尽力回答我的知识 .

    • 在区块链世界中,保护私钥是最重要的 . 如果您将私钥丢失给某人意味着您受到了损害 . 请记住,“ with great power comes great responsibility ". Also, " getUserContext("admin") ”没有't return ' admin ' user context always. I'将在下一个答案中解释 .

    • API文档解释了所有技术细节:getUserContext setUserContext createUser

    所有这些方法都可以在NodeSDK上的'client'类中找到 . 这些方法允许'user'管理 . 当您在Hyperledger Fabric world中说用户时,默认情况下它会附带公钥和私钥引用 . 它还具有所有其他领域,例如联盟,身份,角色等 . 阅读更多:User

    createUser 使用提供的所有/任何上述属性创建 User 类的实例 . 此实例将用于执行所有相关操作 . 如果用户在Hyperledger Fabric世界中具有' admin ' access , it can perform ' admin '级别功能,那么对于其他角色 .

    getUserContextsetUserContext 获取/设置 client 实例's context. By setting appropriate User-context, you'重新验证 client ,前进客户端实例可以使用此上下文对请求进行签名 .

    除此之外,这两种方法都会在配置时读/写一些持久性存储 . 在Node SDK的情况下,它是 hfc-key-store . 如果您检查此文件夹的内容,您将在此处找到所有用户身份 . 如果在此文件夹下找不到必要的文件(或者为crypto-suite配置了哪个文件夹), getUserContext 将失败,然后您必须手动从文件系统中读取证书并从这些证书中创建用户,然后将其用于 setUserContext .

    • cryptogen 工具本质上是静态的 . Fabric CA服务器支持使用Fabric CA Client或Fabric SDK通过REST API进行通信 . 这使得它在 生产环境 环境中非常有用,您需要在移动中生成新的身份(读取证书) . 使用 cryptogen 工具可能会变得很麻烦 .
  • 5

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

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

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

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

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

    • 每个组织's ca has a bootstrap user, this comes by the username and password, usually the samples would use admin/adminpw. During the ca server setup time, this bootstrap user was write to the CA' s db . 安装后,引导用户已注册 . 但没有注册 .

    • 接下来是 enroll the bootstrap user . 在这一步中,fabric-sdk(稍后我将使用sdk)将首先生成私钥/公钥对,然后生成csr(certificate signing request),最后使用私钥对csr进行签名并将签名的csr发送给fabric -ca服务器 .

    • 当fabric-ca服务器收到签名的csr时 . 它为该用户生成证书 . 证书包含证书上的用户's public key. Fabric-ca will use its private key to sign this request and append it'签名 .

    • 来自fabric-ca服务器的sdk get响应(来自3的证书) . fabric-sdk将证书和用户的私钥放在一起(我们称之为注册)作为方法 enroll() 的响应 .

    • 现在,引导用户已注册,并可使用此注册访问结构网络 .

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

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

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

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

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

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

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

    createUser()用于什么?

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

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

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

    • 每个事务都包含用户的标识 . 如果您想通过 userA 提交交易,那么您应该在进一步支持电话之前调用 setUserContext(userA) .

    • 交易提议包含用户's certificate at message header. And before the transaction was send to fabric-peer, sdk will use the current user'的私钥,用于签署此交易提议 .

    • 在同行方面 . 当对等体收到endorse请求时,对等体将使用fabric-ca的根证书来验证该请求中的证书,以便对等体知道该请求来自已知CA发出的身份,现在证书是可信的 . 然后对等体将解析证书并获取身份的公钥,然后使用此公钥验证事务的签名(我在上面描述了tx由私钥签名,现在由公钥验证),现在交易是可信的 .

    从事务流程中,我们了解到必须使用用户's certificate and signed by the user'的私钥发送事务 . 这就是我们在fabirc-sdk设计 setUserContext() 接口的原因 .

    cryptogen工具

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

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

相关问题