网络准入

Corda 网络是有准入机制的。要连接一个网络,一个节点需要在它的 <workspace>/certificates/ 文件夹下有三个 keystores 文件:

在开发模式下(比如当 devMode = true,查看配置节点了解详细信息),如果所需要的 keystores 不存在的话,预先配置好的 keystores 会被使用。这个确保了开发者能够尽快地使节点运行起来。

但是,这些预先配置好的 keystores 并不安全。生产环境的部署是需要一个安全的证书认证机构(certificate autority)的。大多数的生产环境的部署会使用一个已有的证书认证机构或者使用一个软件来构建一个。这个软件会在接下来的几个月中提供可用,在这个软件可用之前,可以使用下边的方法来创建属于你自己的证书认证机构。

证书结构

一个 Corda 网络会有四种类型的证书认证(CAs):

下边的约束也必须要满足:

所有的证书必须要带有 custom role extension 地被发行。

我们可以将 permissioning 结构表示如下:

证书结构

秘钥对(keypair)和证书(certificate)的格式

你可以使用任何的标准的秘钥工具或者 Corda 的 X509Utilities(使用的是 Bouncy Castle)来创建所需的公钥/私钥秘钥对和证书。秘钥对和证书应该遵守以下约束:

证书角色扩展 Certificate role extension

Corda 证书具有一个自定义的 X.509 v3 扩展,它指明了证书有关的角色。这个扩展具有 OIC 1.3.6.1.4.1.50530.1.1 并且是 non-critical 的,在 Corda 节点外的实现可以被安全地忽略。这个扩展包含了一个单一的 ASN.1 数值来区分这个证书的 identity 的类型:

  1. Doorman
  2. Network map
  3. Service identity(当前仅仅在分布式的 notaries 中用作共享的 identity)
  4. 节点证书的 autority(TLS 和 well-known identity 证书被颁发的地方)
  5. 传输层安全,transport layer security
  6. Well-Known legal identity
  7. Confidential legal identity

在一个典型的安装中,节点管理员是不需要在意这些的。但是,当节点的证书是被外部工具来管理的话(比如部署在一个组织的一个已经存在的 PKI 解决方案),理解这些约束就很重要了。

证书路径验证被扩展了,所以如果发行者的证书中显示了扩展的话,那么证书就必须要包含扩展。

创建 root 和 doorman CAs

创建 root network CA 的 keystore 和 truststore

  1. 创建一个新的秘钥对:这个会作为 root network CA 的秘钥对
  2. 为秘钥对创建一个 self-signed 证书。Basic constraints extension 必须设置为 true:这个会作为 root network CA 的证书
  3. 创建一个新的 keystore,将 root network CA 的秘钥对和证书存储到里边以便之后使用:这个 keystore 会被root network CA 用来为 doorman CA 的证书签名
  4. 创建一个新的 Java keystore 名为 truststore.jks,将 root network CA 的证书存储在里边,并且使用一个别名 cordarootca:这个 keystore 稍后会被使用到创建的单独的节点上,这样他们可以将它存储在他们的 certificates 文件夹中

注意:root network CA 的私钥应该被安全地保护起来。

创建 doorman CA 的 keystore

  1. 创建一个秘钥对:这个会被用来作为 doorman CA 的秘钥对
  2. 为这个秘钥对获得一个使用了 root network CA 秘钥签名的证书。Basic constraints extension 必须被设置为 true:这个会被作为 doorman CA 的证书被使用
  3. 创建一个新的 keystore,并且将 doorman CA 的秘钥对和证书链(keypair and certificate chain)存在里边(比如 doorman CA 证书和 root network CA 证书)以便以后使用:这个 keystore 会被 doorman CA 使用来对节点的 identity 证书进行签名

创建节点 CA keystores 和 TLS keystores

创建节点的 CA keystores

  1. 对每一个节点创建一个秘钥对
  2. 为这个秘钥对获得一个使用了 doorman CA key 签名的证书。Basic constraints extension 必须被设置为 true
  3. 创建一个新的 Java keystore 名为 nodekeystore.jks 并且将秘钥对存在里边,使用别名 cordaclientca:节点会将这个 keystore 存储在本地,以用来对它的 identity keys 和 anonymous keys 进行签名

创建节点的 TLS keystore

  1. 对每一个节点创建一个秘钥对
  2. 为这个秘钥对创建一个使用了 node CA key 签名的证书。Basic constraints extension 必须设置为 false
  3. 创建一个新的 Java keystore 名为 sslkeystore.jks 并且将秘钥和证书存储在里边,使用别名 cordaclienttls:节点会将这个 keystore 存储在本地,以用来对它的 TLS 证书进行签名

在节点上安装证书

对于每个节点,将下边的文件放到节点的 certificates 路径下(<workspace>/certificates/):

连接到一个 compatibility zone

想要连接到一个 compatibility zone,你需要在他们的证书签名机构(doorman)那里注册,通过提交一个证书签名请求(certificate signing request)来获得对于该 zone 的一个有效的 identity。

在你可以注册前,你必须要收到一个来自于 zone operator 的包含有 root 证书的 trust store 文件。然后运行下边的命令: java -jar corda.jar --initial-registration --network-root-truststore-password <trust store password>

默认的它会期望 trust store 文件会被存在 certificates/network-root-truststore.jks 路径下。这个可以通过使用额外的 --network-root-truststore flag 被重写。

这个证书签名请求将会基于从节点的配置信息中得到的节点信息来被创建。节点配置文件中的一下信息是需要用来生成这个请求的:

Corda 节点生成的新的私钥和公钥对将会被用来创建这个请求。

Utility 会提交这个请求给 doorman 服务器,然后会定期地进行获取结果来取回证书。一旦这个请求通过了之后,并且证书也从服务器上下载了下来的话,节点会使用证书和生成的私钥来创建 keystore 和 trust store。

注意:如果这个审批流程花费了比预期更长的时间,你可以在任何的时间退出这个 utility。这个请求的流程将会在重启后恢复。

这个流程仅仅在节点第一次连接该网络的时候或者是证书过期之后需要。