13

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

开始吧。当我启动超级账本网络时,它所做的是在端口 7054 上创建 fabric-ca-server docker 映像和容器。在该端口上,它注册了一个用户“admin”,密码为:“adminpwd”。这意味着还制作了证书对于这个用户。现在假设我想从节点 sdk 创建一个新用户。我想我需要做的是拥有管理员证书,以便我可以签署我的请求并且网络知道我是管理员并且是网络。代码的作用是首先写入 getUserContext("admin"),如果找不到,则尝试使用用户名和密码(admin 和 adminpwd)进行注册。我的理解是 getUserContext 转到 hfc-key -store 文件夹并尝试为管理员查找证书。如果找不到,发生注册,然后发生 createUser 函数,它将从 fabric-ca-server docker 映像派生的证书放入 hfc-key-store,因此当管理员尝试再次注册时,它不必去 fabric-ca-server码头工人形象。到目前为止我是对的吗?我现在会问我的问题。

问题 :

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

  2. 我完全不明白 getUserContext() 和 setUserContext() 以及 createUser() 函数的含义。如果可以的话,请用一种非常容易理解的语言来描述它们,因为我已经很长时间没有尝试解决这个问题了,但没有运气。为什么我们需要这些功能,它们对我们有什么帮助等等。

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

4

3 回答 3

19

那里似乎有很多问题。让我一步一步地解释它。如果有问题或不清楚,请提出您的意见。

Fabric 被设计为一种Consortium Blockchain System并广泛应用于企业业务场景。在 Fabric 业务网络中,每个 org 通常包含至少一个 peer,可选的一个 ca.

想想这样的业务场景。几家公司想一起做生意。然而,他们对彼此还不够信任。所以他们决定使用 Fabric 来解决他们的痛点。假设这个网络包含 3 家公司 (orgs),每家公司 (org) 有一个同行和一个 ca。

现在业务网络已经建立。

首先,让我解释一下注册的概念。

  1. 每个组织的 ca 都有一个引导用户,这来自用户名和密码,通常示例将使用 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(key-value-store)的概念。

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

Fabric-sdk 提供了一个 KVS 来执行此操作。这是一个可选的选项,您可以选择使用或不使用它。坦率地说,我不建议在生产系统中使用它。如果你只是想尝试一些东西或测试一些东西,这很好,因为它很简单。

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

那么如果KVS被盗了怎么办?

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

createUser() 是做什么用的?

而不是将这些注册存储在文件系统中。将其存储在应用程序层数据库中的更好选择。每次我们要访问区块链系统,都可以先从db查询,得到证书和privateKey。然后使用该createUser()接口创建一个新的 User 实例。该用户实例用作访问区块链系统的身份。

最后解释一下fabric中的交易流程

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

  1. 每笔交易都包含用户的身份。如果您想通过 提交交易userA,那么您应该setUserContext(userA)在进一步的背书电话之前致电。
  2. 交易提案在消息头中包含用户的证书。并且在交易被发送到fabric-peer之前,sdk会使用当前用户的私钥来签署这个交易提案。
  3. 在对等方。当peer收到背书请求时,peer会使用fabric-ca的根证书来验证这个请求中的证书,这样peer就知道这个请求是来自一个已知CA颁发的身份,现在证书是可信的。然后peer会解析证书并得到身份的公钥,然后用这个公钥验证交易的签名(我上面描述的tx是用私钥签名的,现在是用公钥验证的),现在交易是可信的。

从交易流程中,我们了解到交易必须使用用户的证书发送并由用户的私钥签名。这就是我们setUserContext()在 fabirc-sdk 设计接口的原因。

加密工具

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

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

于 2018-10-23T13:31:38.303 回答
11

您的问题有多个部分;我会尝试从顶部开始。

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

  2. Fabric CA 有多个 API,但主要的两个是 Register 和 Enroll。注册是颁发 X509 证书的过程。您必须先注册用户/节点,然后才能注册它们。首次启动 Fabric CA 时,您必须创建一个“引导”管理员用户。此用户在启动时自动注册,但尚未注册。您通过生成私钥和证书签名请求向 Fabric CA 注册,并使用注册 ID 和 Secret 提交。如果成功,您将收到由 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 基础设施,不包括证书吊销之类的东西。

希望这可以帮助。

于 2018-10-23T10:41:18.753 回答
4

我喜欢你所有的问题,最近我在为 HLF 开发 Node SDK 时遇到了完全相同的问题。

我将尽我所能回答。

  1. 在区块链世界中,保护私钥是重中之重。如果您将私钥泄露给某人,这意味着您对您的私钥解锁的任何实体都失去了所有权。在 Hyperledger Fabric 中,您必须确保密钥的安全,无论是管理员密钥还是用户密钥。如果它以任何方式被盗,那意味着你受到了损害。请记住,“权力越大,责任越大”。此外,“ getUserContext("admin") ”并不总是返回“admin”用户上下文。我将在下一个答案中解释。
  2. API 文档在这里解释了所有技术细节: getUserContext setUserContext createUser

    所有这些方法都可以在 NodeSDK 的“客户端”类中使用。这些方法允许“用户”管理。当您说 Hyperledger Fabric 世界中的用户时,默认情况下它带有一个公钥和一个私钥引用。它还具有所有其他字段,例如从属关系、身份、角色等。阅读更多:用户

    createUser使用提供的所有/任何上述属性创建User类的实例。该实例将用于执行所有相关操作。如果用户具有“管理员”访问权限,则它可以在 Hyperledger Fabric 世界中执行“管理员”级别的功能等其他角色。

    getUserContextsetUserContext获取/设置客户端实例的上下文。通过设置适当的用户上下文,您正在对客户端进行身份验证,并且客户端实例可以使用此上下文对请求进行签名。

    除此之外,如果已配置,这两种方法都可以读取/写入某些持久存储。对于 Node SDK,它是 hfc-key-store。如果您检查此文件夹的内容,您会发现所有用户身份都存储在这里。如果在此文件夹(或为加密套件配置的任何文件夹)下找不到必要的文件,getUserContext将失败,然后您必须从文件系统手动读取证书并从这些证书中创建一个用户,然后将其用于setUserContext .

  3. cryptogen工具本质上是静态的。而 Fabric CA 服务器支持使用 Fabric CA 客户端或 Fabric SDK 通过 REST API 进行通信。这使得它在您需要随时随地生成新身份(读取证书)的生产环境中非常有用。在这里使用cryptogen工具会变得很麻烦。

于 2018-10-23T11:21:45.903 回答