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

13
首先我想解释一下我的正确理解,如果我对了,请告诉我真相,如果我错了,请告诉我我错了。我的解释是关于hyperledger网络和节点SDK如何协同工作以及节点SDK如何连接到hyperledger网络的内容。
让我们开始。当我启动hyperledger网络时,它会在端口7054上创建fabric-ca-server docker镜像和容器。在该端口上,它注册了一个名为“admin”的用户并设置密码为“adminpwd”。这意味着为此用户也创建了证书。现在假设我想从节点SDK创建一个新用户。我猜我需要做的是拥有Admin的证书,这样我就可以签署我的请求,并使网络知道我是管理员并且是网络的一部分。代码首先编写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镜像中获取admin的原始证书,因为如果它被盗,整个网络就会崩溃。所以它做的是使用某种公共/私有和从原始证书派生出来的证书,我可以用其他操作进行操作。问题是:如果有人窃取了包含管理员证书的hfc-key-store文件夹,他可以在不注册的情况下执行操作,因为getUserContext("admin")会返回true,并允许其执行任何操作。如果有人窃取了那个文件夹怎么办?这不危险吗?
2. 我不理解getUserContext()、setUserContext()和createUser()函数的含义。请简单易懂地描述一下它们,因为我已经尝试很长时间,但没有成功。我们为什么需要这些函数,它们对我们有什么帮助等等。
3. 为什么cryptogen工具没有在生产中使用,而fabric-ca-server可以在生产中使用?

  1. Cryptogen 生成了所有与 Fabric 加密相关的必要组件,使用它可以构建必要的 Docker 系统,其中包括将您的 CA_SK 复制到 fabric-ca 容器中,这更加手动化,也可能会在您想在不同的机器上运行相同网络时导致认证问题。使用 Fabric-CA-Server,所有这些问题都解决了,您可以通过 API/fabric-ca-Client 与其交互并注册组织以获取其各自的证书。
- Rangesh
3个回答

19

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

Fabric被设计为一种联盟区块链系统,广泛应用于企业业务场景中。在Fabric业务网络中,每个组织通常至少包含一个对等节点(peer),以及可选一个CA。

可以将一个业务场景想象为这样:几家公司想要共同开展业务。然而,它们之间的信任度不够高。因此,它们决定使用Fabric来解决这个问题。假设该网络包含3家公司(orgs),每家公司(org)都有一个peer和一个ca。

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

首先,让我解释一下enroll这个概念。

  1. 每个组织的ca都有一个引导用户,这个用户通过用户名和密码来访问,通常示例会使用admin/adminpw。在ca服务器设置期间,这个引导用户会被写入CA的db中。设置完成后,引导用户会被注册,但是没有被enroll。
  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. 现在引导用户具有其注册信息,并可以使用此注册信息访问fabric网络。

我们可以使用引导用户在此org中注册和注册新用户。这就是为什么我们将财团区块链系统称为权限区块链系统的原因。

第二,让我解释sdk KVS(键值存储)的概念。

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

Fabric-sdk提供了一个KVS来完成此操作。这是一个可选项,您可以选择使用它或不使用它。坦率地说,我不建议在生产系统中使用它。如果您只是想尝试或测试某些内容,那么这很好,因为它非常简单。

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

KVS被盗会发生什么?

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

createUser()用于什么?

不要把注册信息存储在文件系统中,而是更好地将其存储在应用程序层的数据库中。每次我们想要访问区块链系统时,我们可以先从数据库中查询并获取证书和私钥。然后使用createUser()接口创建新的用户实例。该用户实例用作身份来访问区块链系统。

最后,让我解释一下Hyperledger Fabric中的交易流程

如果我们没有有效的用户证书和私钥,我们如何向Fabric网络发送交易?Fabric节点如何验证交易并知道我的身份?

  1. 每个交易都包含用户的身份信息。如果您要使用userA提交交易,则在进一步背书调用之前,应调用setUserContext(userA)
  2. 交易提案包含消息头中用户的证书。在将交易发送到Fabric节点之前,SDK将使用当前用户的私钥对此交易提案进行签名。
  3. 在对等方的一侧。当对等方收到认可请求时,对等方将使用fabric-ca的根证书来验证此请求中的证书,以便对等方知道此请求来自由已知CA颁发的身份,现在证书是可信的。然后对等方将解析证书并获取身份的公钥,然后使用此公钥验证交易的签名(我上面描述了tx是由私钥签名的,现在由公钥验证),现在交易是可信的。

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

cryptogen工具

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

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


1
我刚刚读完了第一篇“首先,让我解释注册的概念。”。所以你说每个机构都有自己的CA。为什么需要呢?我认为这是因为每个组织都希望拥有自己的CA机构,这样他们就不必信任单独为每个组织使用的CA。我是对的吗?如果是,那么在发送csr请求时,你说组织将csr发送到fabric-ca。为什么要将csr发送到fabric-ca而不是发送到自己的CA? - Nika Kurashvili
1
以上是我的第一个问题。 - Nika Kurashvili
1
第四个问题:因此,证书的权力比用户名和密码少得多。为什么?如果我有用户名和密码,或者有人窃取了我的用户名和密码,他们将获得一个有效的新证书。因此,真正的力量仍在于用户名和密码。这不是很糟糕吗? - Nika Kurashvili
1
第五个问题:getUserContext("admin") 返回什么?它返回 User 实例吗?如果是这样的话,我看到了 fabric-samples 代码,在 getUserContext("admin") 后面,他们写了这段代码fabric_ca_client.register({enrollmentID: 'user8', affiliation: 'org1.department1',role: 'client'}, admin_user);那么为什么我要传递 admin_user?我已经证明我是管理员,因为 getUserContext("admin") 做了正确的事情并给了我用户,对吧?你提到如果我执行 setUserContext(UserA),我就可以提交交易。为什么 getUserContext("admin") 不起同样的作用呢? - Nika Kurashvili
1
第一个问题,每个组织都拥有自己的CA,它可以是Fabric-CA的实例或任何其他CA。CSR已发送到每个组织自己的CA。 - zhaochy
显示剩余10条评论

11

你的问题有多个部分,我会从顶部开始解答。

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

  2. Fabric CA具有多个API,但主要的两个是注册和认证。认证是发放X509证书的过程。在认证之前,您必须先注册用户/节点。当首次启动Fabric CA时,必须创建“引导”管理员用户。该用户在启动时自动注册,但尚未认证。您可以通过生成私钥和证书签名请求,并使用认证ID和密钥提交来进行认证。如果认证成功,则您将收到由Fabric CA签名的X509证书。

  3. 为方便起见,Fabric节点SDK提供了一个fabric-ca-client软件包,它提供了用于向Fabric CA注册和认证用户的包装API。这使您可以从Fabric CA获取和使用凭据。

  • 然而,fabric-client软件包不要求您从Fabric CA获得凭据。 您可能拥有自己的私钥和由其他机构(甚至是由cryptogen生成)颁发的X509证书。

  • fabric-client提供了一个“可插拔”的密钥存储库来存储凭据。 默认情况下使用基于文件的密钥存储库。

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

  • 一旦您拥有了一个User对象,您需要告诉fabric-client使用它。这就是您使用Client.setUserContext()的地方。您传递User对象,默认情况下将持久化存储。
  • 然后,当您启动客户端应用程序时,可以使用Client.getUserContext() - 它从配置的密钥库中加载用户信息 - 供以后的请求使用。
  • 至于您关于cryptogen的问题,您完全可以在生产中使用生成的加密材料......它只是一个旨在帮助开发和测试引导网络的工具。它不是PKI基础设施,也不包括像证书吊销这样的东西。

    希望这能有所帮助。


    1
    你好。感谢您提供的答案。我很沮丧。我们可以私聊一下,这样我就能更好地理解了吗?您在哪里可以找到?stackoverflow 对我们帮助不大。 - Nika Kurashvili
    1
    @Gari Singh,IBM 云如何不存储证书和私钥,因为他们提供了一种查看和保存证书的选项,并表示他们不会存储这些证书? - Adarsha Jha
    1
    我猜你在谈论新的IBM区块链服务?我们在客户端/浏览器端生成所有加密材料,因此我们从不保存任何服务器上的内容(对于客户端加密材料)。对于节点、排序器和CA,材料保存在客户的Kubernetes集群使用的存储中。IBM区块链团队无法访问这些材料。 - Gari Singh
    1
    @GariSingh 非常感谢您的快速回复,还有一个问题。如果我删除了 hfc-key-store 文件夹,然后用户签署交易会失败吗? 在我的情况下,为了避免在我的节点上存储证书,我应该在每个组织的节点上设置 CA,这样我就无法访问它了? - Adarsha Jha
    @GariSingh,我的问题是我希望用户在其设备或浏览器上注册并下载证书,并在签署任何交易时上传证书。我不想存储证书。请指导我如何实现这一点? - Adarsha Jha

    4

    我很喜欢你的问题,最近我在为 HLF 的 Node SDK 工作时也遇到了完全相同的问题。

    根据我的知识,我会尽力回答。

    在区块链世界中,保护私钥是最重要的。如果您将私钥输给他人,那就意味着您失去了对与此私钥解锁的任何实体的所有权。在Hyperledger Fabric中,您必须确保密钥的安全性,无论是管理员密钥还是用户密钥。如果以任何方式被盗,那么您就会遭到危害。请记住:“伴随着巨大的力量而来的是巨大的责任”。“getUserContext(“admin”)”并不总是返回'admin'用户上下文。我将在下一个答案中解释。
    API文档在这里说明了所有技术细节:getUserContext setUserContext createUser 这些方法都可以在NodeSDK的“client”类上使用。这些方法允许“用户”管理。在Hyperledger Fabric世界中,当您说一个用户时,默认情况下它带有公钥和私钥引用。 它还具有其他字段,如从属关系,身份,角色等。 请阅读更多信息:User “createUser”使用提供的所有/任何上述属性创建“User”类的实例。该实例将用于执行所有相关操作。如果用户具有“admin”访问权限,则可以在Hyperledger Fabric世界中执行“admin”级别操作,其他角色也一样。
    “getUserContext”和“setUserContext”获取/设置客户端实例的上下文。通过设置适当的用户上下文,您正在对客户端进行身份验证,并且客户端实例可以使用此上下文来签署请求。除此之外,这两种方法还会读取/写入某些持久存储(如果已配置)。 在NodeSDK的情况下,它是“hfc-key-store”。 如果在此文件夹下找不到必要的文件(或者为加密套件配置了任何文件夹),则“getUserContext”将失败,然后您必须手动从文件系统中读取证书并通过这些证书创建用户,然后将其用于“setUserContext”。
    “cryptogen”工具在其本质上是静态的。而Fabric CA服务器支持使用Fabric CA Client或Fabric SDK通过REST API进行通信。 这使其在需要在生产环境中生成新标识(读取证书)时非常有用。 使用“cryptogen”工具可能变得繁琐。

    1
    你好。感谢你的回答。我很沮丧。我们可以私聊一下,这样我就能更好地理解了吗?你在哪里可以找到?stackoverflow对我们帮助不大。 - Nika Kurashvili

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接