证书如何从Hyperledger的hfc-key-store中的真实Fabric-ca-Server证书中获取?

时间:2018-10-22 10:20:21

标签: docker hyperledger-fabric hyperledger hyperledger-fabric-ca

我想先解释一下我正确理解的内容,如果我是对的,请告诉我真相,如果我错了,还请告诉我我错了。我的解释是关于Hyperledger Network和Node sdk如何协同工作以及Node sdk如何连接到Hyperledger Network。

开始吧。当我启动超级账本网络时,它所做的是在端口7054上创建fabric-ca-server docker映像和容器。在该端口上,它注册了一个用户“ admin”,密码为“ adminpwd”。这意味着还进行了证书制作假设我要从节点sdk创建一个新用户,我想我需要做的是拥有Admin的证书,以便我可以签名请求,并且网络知道我是admin,并且该代码的作用是首先写入getUserContext(“ admin”),如果找不到,则尝试使用用户名和密码(admin和adminpwd)进行注册。我的理解是getUserContext进入hfc-key -store文件夹并尝试查找admin的证书。如果找不到,则会进行注册,然后再执行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. 为什么加密元工具不在生产中使用,但fabric-ca-server在生产中可用?

3 个答案:

答案 0 :(得分:8)

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

Fabric被设计为Consortium Blockchain System,并广泛用于企业业务场景中。在Fabric业务网络中,每个组织通常包含至少一个对等方,以及一个可选的大约ca。

考虑这样的业务场景。几家公司想一起做生意。但是,他们彼此之间没有足够的信任。因此,他们决定使用Fabric解决痛点。假设此网络包含3个公司(组织),并且每个公司(组织)有一个对等方和一个ca。

现在已经建立了业务网络。

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

  1. 每个组织的ca都有一个引导用户,这由用户名和密码提供,通常示例将使用admin / adminpw。在ca服务器设置期间,此引导用户已写入CA的db。设置完成后,注册引导用户。但尚未注册。
  2. 下一个是enroll the bootstrap user。在此步骤中,fabric-sdk(稍后将使用sdk)将首先生成私钥/公钥对,然后生成csr(certificate signing request),最后使用私钥对csr签名并发送已将csr签名到fabric-ca服务器。
  3. fabric-ca服务器收到签名的csr时。它为此用户生成一个证书。证书包含用户的公共密钥。 Fabric-ca将使用其私钥对该请求进行签名,并将其签名附加在证书上。
  4. sdk从fabric-ca服务器获取响应(来自3的证书)。 fabric-sdk将证书和用户的私钥放在一起(我们称为注册),作为方法enroll()的响应。
  5. 现在引导用户已注册,并且可以使用此注册访问光纤网络。

我们可以使用引导用户在该组织中注册和注册新用户。这就是为什么我们将财团区块链系统称为许可区块链系统。

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

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

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

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

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

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

createUser()用作什么?

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

最后,让我解释一下架构中的事务流

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

  1. 每笔交易都包含用户的身份。如果您想通过userA提交交易,那么您应该在进一步的背书之前致电setUserContext(userA)
  2. 交易建议在邮件标题中包含用户的证书。在将交易发送到Fabric-peer之前,sdk将使用当前用户的私钥来签署此交易建议。
  3. 在对等端。当对等方收到认可请求时,对等方将使用fabric-ca的根证书来验证此请求中的证书,以便对等方知道此请求来自已知CA发出的身份,现在该证书是可信的。然后,对等方将解析证书并获取身份的公钥,然后使用此公钥来验证交易的签名(我在上面已经描述过,tx是由私钥签名的,现在已由公钥验证),现在该交易是可信任的。

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

cryptogen工具

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

  

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

答案 1 :(得分:5)

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

  1. 不需要Fabric CA来运行/操作Fabric对等节点或订购者节点。默认安全机制基于使用椭圆曲线的标准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软件包,该软件包提供了包装API,用于在Fabric CA中注册和注册用户。这使您可以从Fabric CA中获取和使用凭据

  4. 但是,fabric-client程序包不需要您从Fabric CA获取凭据。您可能拥有自己的私钥和X509证书,该证书是由其他机构颁发的(甚至是由加密货币生成的)。

  5. 结构客户端提供了一个“可插入”密钥存储区,用于存储凭证。默认值为基于文件的密钥存储。

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

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

关于您对cryptogen的问题,没有理由为什么不能在生产中使用生成的加密材料……这仅仅是因为它是一个真正旨在帮助进行开发和测试以引导的工具一个网络。它不是PKI基础结构,不包含证书吊销之类的东西。

希望这会有所帮助。

答案 2 :(得分:2)

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

我将尽我所能回答。

  1. 在区块链世界中,保护私钥是重中之重。如果您向某人释放私钥,则意味着您已失去对私钥解锁的任何实体的所有权。在Hyperledger Fabric中,您必须确保密钥的安全性,无论是管理密钥还是用户密钥。如果它以任何方式被盗,则表示您已受到损害。请记住,“ 强大的力量伴随着巨大的责任”。另外,“ getUserContext(“ admin”)”并不总是返回“ admin”用户上下文。我将在下一个答案中进行解释。
  2. API文档在这里说明了所有技术: getUserContext setUserContext createUser

    所有这些方法在NodeSDK的“ client”类上可用。这些 方法允许“用户”管理。当您说Hyperledger中的用户时 Fabric世界,默认情况下,它带有公共和私有密钥 参考。它具有所有其他字段,例如从属关系,身份, 角色等。要了解更多信息,请访问:User

    createUser 创建具有所有上述所有属性的 User 类的实例。该实例将被使用 进行所有相关操作。如果用户具有“ 管理员”访问权限, 它可以在Hyperledger Fabric中执行“ admin ”级别的功能 世界等等。

    getUserContext setUserContext 获取/设置客户端实例的上下文。通过设置适当的用户上下文,您可以 验证客户端并前进客户端实例可以 使用此上下文来签署请求。

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

  3. cryptogen 工具本质上是静态的。而Fabric CA服务器 支持使用Fabric CA Client通过REST API进行通信,或者 Fabric SDK。这使其在生产环境中非常有用 您需要在其中生成新身份(读取证书)的地方 走。在这里使用 cryptogen 工具可能很麻烦。