完整文档页面(中文翻译)。文末附有来源说明。

阅读英文版

global-synchronizerproduction-operationskms-operations

Canton KMS 运维

配置并运维 Canton 密钥管理服务(KMS)。

为 Canton 配置和运行 KMS:AWS、GCP、基于驱动程序;模式选择、迁移和密钥轮换。

默认情况下,Canton 密钥在节点中生成并存储在节点的主存储中。我们目前支持 Canton 的一个版本,该版本可以使用 KMS 来:(a) 保护 Canton 的静态私钥或 (b) 通过将密钥存储在 KMS 中来保护静态和使用时的私钥。

在这些部分中,我们有时将选项 (a) 称为 信封加密,将选项 (b) 称为 外部密钥

您可以在安全加密私钥存储中找到有关此密钥管理功能的更多背景信息。如果您想了解 Canton 如何使用 KMS 在 Canton 内部存储私钥时保护私钥,请参阅使用信封加密和密钥管理服务保护私钥,或者使用密钥管理服务外部化私钥,了解有关 Canton 如何启用外部 KMS 生成和存储私钥的更多详细信息。

以下部分重点介绍如何设置参与者节点以与 KMS 一起运行;但是,大多数配置也适用于 Sequencer 和 Mediator。

1.配置KMS

我们目前支持三种替代方案:

  1. AWS KMS* 2.GCP KMS*
  2. 基于驱动程序的 KMS 允许用户通过使用 Canton 的 KMS 驱动程序 API 实现必要的挂钩来集成自己的 KMS 提供商。有关如何实施 Canton KMS 驱动程序的更多信息,请参阅 Canton KMS 驱动程序开发人员指南。

\* 仅在企业版中可用。

  1. 选择操作模式

    您可以选择:

    1. 使用 KMS 启用加密私钥存储 – 有时称为“信封加密”,仅保护 Canton 的静态私钥。
    2. 使用 KMS 启用外部密钥存储 – 有时称为“外部 KMS 密钥”,私钥完全在 KMS 内生成和存储。
  2. 迁移到 KMS

    如何在非 KMS 节点和 KMS 节点之间迁移,反之亦然。

  3. 使用 KMS 轮换密钥

    如何使用 Canton 控制台命令轮换现有 KMS 管理的密钥。

{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/configuration/kms_configuration.rst” hash=“3c286d0d” */}

配置KMS

本节介绍如何在 Canton 配置密钥管理系统 (KMS)。

目前,可以使用三种 KMS 替代方案:

  • AWS KMS*
  • GCP KMS*
  • 基于驱动程序的 KMS 允许用户通过使用 Canton 的 KMS 驱动程序 API 实现必要的挂钩来集成自己的 KMS 提供商。在 Canton KMS 驱动程序开发人员指南中了解有关如何实施 Canton KMS 驱动程序的更多信息。

\* 仅在企业版中可用。

{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/mode/kms_mode.rst” hash=“82b212ee” */}

选择KMS操作模式Canton 支持使用密钥管理服务 (KMS) 来提高存储私钥的安全性。为了让 Canton 实际使用 KMS,您需要决定并配置两种独立方式之一来使用此服务:

1.启用加密私钥存储

在这种模式下,Canton 在内部生成私钥,KMS 仅用于保护这些静态密钥(即密钥在存储到 Canton 数据库之前进行加密)。这提供了额外的安全层,无需生成外部密钥。

2.启用外部密钥存储

在此模式下,私钥完全生成并存储在 KMS 内。 Canton 永远不会看到原始私钥材料,并且与 KMS 交互只是为了执行加密操作。

在本文档中,这些模式可能分别称为 **信封加密** 和 **外部密钥**。

{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/mode/encrypted_key_storage.rst” hash=“9b3e7c0c” */}

使用 KMS 启用加密私钥存储

Canton 可以使用 KMS 来加密静态私钥(信封加密):

  1. 私钥加密存储在节点的数据库中。
  2. 启动时,KMS 会对它们进行解密以供内存中使用。

这提高了安全性,并且不会影响运行时性能。有关详细信息,请参阅使用信封加密和密钥管理服务保护私钥。

这假设 KMS 提供程序已配置。请参阅配置 KMS。

启用信封加密

信封加密是 KMS 供应商选择的一种常见方法,它使用对称加密密钥(称为“包密钥”)来加密和解密存储的私钥。

要使用信封加密通过 KMS 启用加密私钥存储,我们必须添加以下配置并重新启动节点。

canton.participants.participant1.crypto.private-key-store.encryption.type = kms

新节点和现有节点(包括参与者)都可以配置为使用此功能。

在这两种情况下,密钥都以加密方式存储在 Canton 节点的数据库中。

从数据库备份恢复需要访问备份数据加密期间使用的包器密钥。删除包器键会导致备份无法使用。

手动生成包密钥

默认情况下,节点重启后 Canton 会自动生成新的对称包密钥。如果要使用预生成的包密钥,则必须首先在 KMS 中创建新的包密钥并记录其标识符,同时考虑以下要求。

AWS KMS 包器关键要求

用于识别包器键的支持值:

  • 钥匙 ID:1234abcd-12ab-34cd-56ef-1234567890ab
  • 密钥 ARN(亚马逊资源名称):arn:aws:kms:us-east-1:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab
  • 密钥别名:alias/test-key

请注意,如果您使用现有密钥,则它必须是使用正确方案的对称密钥。在 AWS KMS 中,这意味着:* 关键规格:SYMMETRIC_DEFAULT

  • 密钥用法:ENCRYPT_DECRYPT

GCP KMS 包器关键要求

用于识别包器键的支持值:

  • 按键名称:test-key
  • 关键资源名称(RN):projects/gcp-kms-testing/locations/us-east1/keyRings/canton-test-keys/cryptoKeys/test-key/cryptoKeyVersions/1

请注意,如果您使用现有密钥,则必须使用以下属性创建它:

  • 关键算法:GOOGLE_SYMMETRIC_ENCRYPTION
  • 主要用途:ENCRYPT_DECRYPT

KMS 驱动程序关键要求

唯一标识键的方式留给驱动程序实现。然而,必须遵守以下限制:

  • 密钥长度必须为 128 位,并且可与 AES-GCM 加密方案一起使用。

将新的包器密钥添加到配置中

创建密钥并掌握其 ID 后,您必须使用以下命令将 ID 显式添加到配置中:

```none theme={"theme":{"light":"github-light","dark":"github-dark"}} canton.participants.participant1.crypto.private-key-store.encryption.wrapper-key-id = alias/canton-kms-test-key ```

下面显示了将 AWS KMS 和信封加密与手动生成的包器密钥结合在一起的示例配置:

_shared_aws {
  # Configure an AWS KMS
  crypto {
    kms {
      type = aws
      region = us-east-1
      multi-region-key = false
      audit-logging = false
    }

    # Configure an encrypted store with KMS
    private-key-store {
      encryption.type = kms
      # In this example we are using the same wrapper key for all nodes. This is not recommended and you should
      # either let Canton generate those keys or choose a different one for each node.
      encryption.wrapper-key-id = alias/canton-kms-test-key
    }
  }
}

随后重新启动后,操作员不需要指定包器密钥的标识符; Canton 将包密钥 ID 存储在数据库中。

{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/mode/external_key_storage.rst” hash=“32773506” */}

使用 KMS 启用外部密钥存储

本节介绍如何为广州参与者启用外部密钥存储,以便私钥由 KMS 存储和管理,并且使用这些密钥的所有加密操作都必须经过 KMS。

这假设 KMS 提供程序已配置。请参阅配置 KMS。

要启用外部密钥存储和使用,请在新参与者节点的初始引导之前应用以下配置。 如果您要更新现有参与者,则必须遵循迁移指南: 使用 KMS 迁移到外部密钥存储。

canton.participants.participant1.crypto.provider = kms

下面显示了将 AWS KMS 配置和外部密钥存储配置组合在一起的完整示例配置:```none theme={“theme”:{“light”:“github-light”,“dark”:“github-dark”}} canton.participants.participant1.crypto.provider = kms canton.participants.participant1.crypto.kms { type = aws region = us-east-1 multi-region-key = false # optional, default is false audit-logging = true # optional, default is false }


通过选择正确的 `type`(AWS、GCP 或驱动程序),相同的配置适用于所有 KMS 类型。

此配置告诉 Canton,我们希望在 KMS 中使用外部密钥,这些密钥**在参与者启动时默认自动创建 - 无需进一步操作。** 如果您更喜欢使用自己手动生成且已存储在 KMS 中的密钥,请继续阅读。

## 使用手动生成的密钥运行

本指南展示了如何使用 KMS 中手动生成的密钥配置参与者节点,而不依赖于 Canton 自动生成密钥

第一步是在 KMS 中为参与者手动生成新密钥。下面列出了所有必需的键,包括:

* 一个(签名)命名空间密钥;
* 协议签名密钥;
* Sequencer验证密钥;
* 非对称加密密钥;

使用支持的密钥算法和用途生成 KMS 中的每个密钥,如外部密钥的表密钥配置中所示,并记录生成的密钥标识符。

为了能够使用这些键,您必须在参与者中配置手动初始化。手动初始化节点身份中对此进行了详细说明。然而,值得注意的是,与那里描述的相反,密钥应该被注册,而不是生成。必须为每个密钥分配正确的用法(请参阅签名密钥用法)。

```scala theme={"theme":{"light":"github-light","dark":"github-dark"}}
// Register the KMS signing key used to define the node identity.
val namespaceKey = node.keys.secret
  .register_kms_signing_key(
    namespaceKmsKeyId,
    SigningKeyUsage.NamespaceOnly,
    name = s"${node.name}-${SigningKeyUsage.Namespace.identifier}",
  )

// Register the KMS signing key used to authenticate the node toward the Sequencer.
val sequencerAuthKey = node.keys.secret
  .register_kms_signing_key(
    sequencerAuthKmsKeyId,
    SigningKeyUsage.SequencerAuthenticationOnly,
    name = s"${node.name}-${SigningKeyUsage.SequencerAuthentication.identifier}",
  )

// Register the signing key used to sign protocol messages.
val signingKey = node.keys.secret
  .register_kms_signing_key(
    signingKmsKeyId,
    SigningKeyUsage.ProtocolOnly,
    name = s"${node.name}-${SigningKeyUsage.Protocol.identifier}",
  )

// Register the encryption key.
val encryptionKey = node.keys.secret
  .register_kms_encryption_key(encryptionKmsKeyId, name = node.name + "-encryption")

其中 xyzKmsKeyId 是特定密钥的 KMS 密钥标识符(例如 KMS Key ARN)。

使用AWS跨账户密钥时,无法使用密钥ID,请改用密钥`ARN`。

{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/configuration/kms_aws_config.rst” hash=“a785a56a” */}

配置 Amazon Web Services (AWS) KMS

与其他 Canton 功能一样,AWS KMS 配置是在 Canton 节点的配置文件中启用的。 AWS 的 KMS 配置如下:
canton.participants.participant1.crypto.kms {
    type = aws
    region = us-east-1
    multi-region-key = false # optional, default is false
    audit-logging = false # optional, default is false
}
  • type 指定要使用的 KMS。
  • region 指定AWS KMS 绑定到哪个区域。
  • multi-region-key 标志支持复制 AWS KMS 生成的密钥。打开复制后,操作员可以将密钥从一个区域复制到另一个区域(注意:Canton 不会自动完成密钥复制),并在稍后的时间点更改在 Canton 中配置的区域,而无需任何其他密钥轮换。 标准单区域方法适用于大多数场景
  • audit-logging 标志可记录对 AWS KMS 的每次调用。

配置AWS凭证和权限

为了对 AWS KMS 进行 API 调用,Canton 使用标准 AWS 凭证访问。例如,可以使用标准环境变量AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY。或者,您可以指定 AWS 配置文件(例如,使用临时访问配置文件凭证 - sts)。

AWS 凭证的保护和轮换由节点运营商负责。

AWS KMS 所需的授权操作(例如 IAM 权限)取决于在 Canton 中选择的操作模式。

信封加密的权限

使用信封加密时需要以下 IAM 权限:

  • kms:CreateKey
  • kms:Encrypt
  • kms:Decrypt
  • kms:DescribeKey
如果您使用跨账户密钥,则**不需要**需要`kms:CreateKey`权限。

外部 KMS 的权限

使用 外部 KMS 时需要以下 IAM 权限,其中密钥完全由 AWS KMS 管理和直接使用:

  • kms:CreateKey
  • kms:TagResource
  • kms:Decrypt
  • kms:Sign
  • kms:DescribeKey
  • kms:GetPublicKey
如果您使用跨账户密钥,则**不需要**需要`kms:CreateKey`和`kms:TagResource`权限。

可审计性

AWS 提供了监控 KMS 密钥的工具。对于AWS设置自动外部日志记录,请参考AWS官方文档。其中包括有关如何设置 AWS Cloud Trail 或 Cloud Watch 警报以跟踪 KMS 密钥或执行的加密操作的使用情况的说明。 Canton 记录因使用 KMS 密钥而导致的错误。

日志记录

为了进一步进行审计,Canton 可以配置为记录对 AWS KMS 的每次调用。要启用此功能,请将 KMS 配置的 audit-logging 字段设置为 true。默认情况下,当使用基于文件的日志记录配置时,此类日志将写入主 Canton 日志文件中。要将它们写入专用日志文件,请将 KMS_LOG_FILE_NAME 环境变量或 --kms-log-file-name CLI 标志设置为文件的路径。可以使用环境变量或 CLI 标志来配置这些参数和其他参数:|环境变量 | CLI 标志 |目的|默认 | | -------------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------- | ----------------- | | KMS_LOG_FILE_NAME | —kms-日志文件名 |专用 KMS 日志文件的路径 |未设置 | | KMS_LOG_立即_刷新| —kms-log-立即刷新 |如果为 true,日志将立即刷新到 KMS 日志文件 |真实 | | KMS_LOG_FILE_ROLLING_PATTERN | —kms-log-file-rolling-pattern | —kms-log-file-rolling-pattern |使用滚动文件策略滚动 KMS 日志文件时使用的模式 |年-月-日 | | KMS_LOG_FILE_HISTORY | —kms-日志文件历史记录 |使用滚动文件策略时保留的 KMS 日志文件的最大数量 | 0(即无限制)|

KMS 日志记录配置

AWS KMS 审核日志示例:

2023-09-12 15:44:54,426 [env-execution-context-27] INFO  c.d.c.c.k.a.a.AwsRequestResponseLogger:participant=participant1 tid:40d47592f1bd50f37e6804fbdff404dd - Sending request [06cc259e220da647]: DecryptRequest(CiphertextBlob=** Ciphertext placeholder **, KeyId=91c48ce4-ec80-44c1-a219-fdd07f12f002, EncryptionAlgorithm=RSAES_OAEP_SHA_256) to https://kms.us-east-1.amazonaws.com/
2023-09-12 15:44:54,538 [aws-java-sdk-NettyEventLoop-1-15] INFO  c.d.c.c.k.a.a.AwsRequestResponseLogger:participant=participant1 tid:40d47592f1bd50f37e6804fbdff404dd - Received response [06cc259e220da647]: [Aws-Id: 1836823c-bb8a-44bf-883d-f33d696bf84f] - DecryptResponse(Plaintext=** Redacted plaintext placeholder **, KeyId=arn:aws:kms:us-east-1:724647588434:key/91c48ce4-ec80-44c1-a219-fdd07f12f002, EncryptionAlgorithm=RSAES_OAEP_SHA_256)
2023-09-12 15:44:54,441 [env-execution-context-138] INFO  c.d.c.c.k.a.a.AwsRequestResponseLogger:participant=participant1 tid:40d47592f1bd50f37e6804fbdff404dd - Sending request [e28450df3a98ea23]: SignRequest(KeyId=f23b5b37-b4e8-494d-b2bc-1fca12308c99, Message=** Sign message text placeholder **, MessageType=RAW, SigningAlgorithm=ECDSA_SHA_256) to https://kms.us-east-1.amazonaws.com/
2023-09-12 15:44:54,554 [aws-java-sdk-NettyEventLoop-1-2] INFO  c.d.c.c.k.a.a.AwsRequestResponseLogger:participant=participant1 tid:40d47592f1bd50f37e6804fbdff404dd - Received response [e28450df3a98ea23]: [Aws-Id: 7085bcf3-1a36-4048-a38b-014b441afa11] - SignResponse(KeyId=arn:aws:kms:us-east-1:724647588434:key/f23b5b37-b4e8-494d-b2bc-1fca12308c99, Signature=** Signature message text placeholder **, SigningAlgorithm=ECDSA_SHA_256)

请注意,敏感数据在记录之前已被删除。一般日志格式如下:

tid:<canton_trace_id> - Sending request [<canton_kms_request_id>]: <request details>``tid:<canton_trace_id> - Received response [<canton_kms_request_id>]: [Aws-Id: <aws_request_id>] - <response details>{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/configuration/kms_gcp_config.rst” hash=“b03c88a5” */}

配置 Google 云提供商 (GCP) KMS

与其他 Canton 功能一样,GCP KMS 配置是在 Canton 节点的配置文件中启用的。 GCP 的 KMS 的配置方式如下:

canton.participants.participant2.crypto.kms {
    type = gcp
    location-id = us-east1
    project-id = gcp-kms-testing
    key-ring-id = canton-test-keys-2023
    audit-logging = false # optional, default is false
}
  • type 指定要使用的 KMS。
  • location-id指定GCP KMS绑定到哪个区域。
  • project-id 指定我们要绑定到哪个项目。
  • key-ring-id 指定要使用的密钥环。为整个密钥环启用多区域密钥。因此,KMS 操作员负责根据系统的需要正确设置密钥环。
  • audit-logging 标志,用于记录对 GCP KMS 的每次调用

配置 GCP 凭据和权限

对于 GCP,Canton 使用 GCP 服务帐户。例如,在为服务帐户设置本地应用程序默认凭据 (ADC) 文件后,可以使用标准环境变量GOOGLE_APPLICATION_CREDENTIALS。对于支持的环境,例如GKE、Canton 可以从元数据服务应用程序默认凭据中获取凭据。

GCP 凭证的保护和轮换是节点运营商的责任。

GCP KMS 所需的授权操作(例如 IAM 权限)取决于在 Canton 中选择的操作模式。

信封加密的权限

使用信封加密时需要以下 IAM 权限:

  • cloudkms.cryptoKeyVersions.create
  • cloudkms.cryptoKeyVersions.useToEncrypt
  • cloudkms.cryptoKeyVersions.useToDecrypt
  • cloudkms.cryptoKeys.get
如果您使用跨项目密钥,则**不需要**需要`cloudkms.cryptoKeyVersions.create`权限。

外部 KMS 的权限

使用 外部 KMS 时需要以下 IAM 权限,其中密钥完全由 GCP KMS 管理和直接使用:

  • cloudkms.cryptoKeyVersions.create
  • cloudkms.cryptoKeyVersions.useToDecrypt
  • cloudkms.cryptoKeyVersions.useToSign
  • cloudkms.cryptoKeyVersions.get
  • cloudkms.cryptoKeyVersions.viewPublicKey
如果您使用跨项目密钥,则**不需要**需要`cloudkms.cryptoKeyVersions.create`权限。

可审计性

GCP 提供了监控 KMS 密钥的工具。有关GCP日志记录信息,您可以参考GCP官方文档。 Canton 记录因使用 KMS 密钥而导致的错误。

日志记录为了进一步进行审计,Canton 可以配置为记录对 GCP KMS 的每次调用。要启用此功能,请将 KMS 配置的 audit-logging 字段设置为 true。默认情况下,当使用基于文件的日志记录配置时,此类日志将写入主 Canton 日志文件中。要将它们写入专用日志文件,请将 KMS_LOG_FILE_NAME 环境变量或 --kms-log-file-name CLI 标志设置为文件的路径。可以使用环境变量或 CLI 标志来配置这些参数和其他参数:

环境变量CLI 标志目的默认
KMS_LOG_FILE_NAME—kms-日志文件名专用 KMS 日志文件的路径未设置
KMS_LOG_立即_刷新—kms-log-立即刷新如果为 true,日志将立即刷新到 KMS 日志文件真实
KMS_LOG_FILE_ROLLING_PATTERN—kms-log-file-rolling-pattern—kms-log-file-rolling-pattern使用滚动文件策略滚动 KMS 日志文件时使用的模式
KMS_LOG_FILE_HISTORY—kms-日志文件历史记录使用滚动文件策略时保留的 KMS 日志文件的最大数量0(即无限制)

KMS 日志记录配置

GCP KMS 审核日志示例:

2023-09-12 15:44:54,426 [env-execution-context-27] INFO  c.d.c.c.k.g.a.GcpRequestResponseLogger:participant=participant1 tid:40d47592f1bd50f37e6804fbdff404dd - Sending request [67d92ffb-438b-4dd5-8175-7a54ced7ac3a]: DecryptRequest(CiphertextBlob=** Ciphertext placeholder **, KeyId=canton-kms-test-key, EncryptionAlgorithm=RSAES_OAEP_SHA_256).
2023-09-12 15:44:54,538 [env-execution-context-32] INFO  c.d.c.c.k.g.a.GcpRequestResponseLogger:participant=participant1 tid:40d47592f1bd50f37e6804fbdff404dd - Received response DecryptResponse(Plaintext=** Redacted plaintext placeholder **, KeyId=canton-kms-test-key, EncryptionAlgorithm=RSAES_OAEP_SHA_256). Original request [67d92ffb-438b-4dd5-8175-7a54ced7ac3a]
2023-09-12 15:44:54,441 [env-execution-context-138] INFO  c.d.c.c.k.g.a.GcpRequestResponseLogger:participant=participant1 tid:40d47592f1bd50f37e6804fbdff404dd - Sending request [b3aa6202-1734-4751-8ae0-55b7d15c2abb]: SignRequest(KeyId=canton-kms-test-key, Message=** Sign message text placeholder **, MessageType=RAW, SigningAlgorithm=ECDSA_SHA_256).
2023-09-12 15:44:54,554 [env-execution-context-145] INFO  c.d.c.c.k.g.a.GcpRequestResponseLogger:participant=participant1 tid:40d47592f1bd50f37e6804fbdff404dd - Received response SignResponse(KeyId=canton-kms-test-key, Signature=** Signature message text placeholder **, SigningAlgorithm=ECDSA_SHA_256). Original request [b3aa6202-1734-4751-8ae0-55b7d15c2abb]

请注意,敏感数据在记录之前已被删除。一般日志格式如下:tid:<canton_trace_id> - Sending request [<canton_kms_request_id>]: <request details>``tid:<canton_trace_id> - Received response <response details>. Original request [<canton_kms_request_id>]

{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/configuration/kms_driver_config.rst” hash=“2ea5fd56” */}

配置基于驱动程序的 KMS

Canton 允许通过 KMS 驱动程序与各种 KMS 和 HSM 解决方案集成。这种方法使您能够通过构建自己的集成层将 Canton 连接到外部密钥管理器。

配置 Canton 以使用 KMS 驱动程序运行的方式与其他 KMS 提供商类似,通过指定:

type = driver
name = <name_of_driver>

例如,对于名为 `participant1` 的参与者:

canton.participants.participant1.crypto.provider = kms
canton.participants.participant1.crypto.kms {
  type = driver
  name = "aws-kms"
    config = {
      region = us-east-1
      multi-region-key = false
      audit-logging = true
    }
}
  • type指定使用哪个KMS;在这种情况下,是一名司机。
  • name 是为驱动程序配置的唯一标识名称。
  • KMS驱动程序特定的配置可以通过config字段传入。

除了此配置之外,您还必须提供一个.jar文件,该文件实现所需的API并充当Canton和目标KMS之间的桥梁。

在类路径上使用驱动程序 .jar 运行 Canton:

java -cp driver.jar:canton.jar com.digitalasset.canton.CantonEnterpriseApp -c canton.conf # further canton arguments

有关在 Canton 开发和部署您自己的 KMS 驱动程序的指南,请参阅 Canton KMS 驱动程序开发人员指南。本指南包括构建自定义驱动程序的说明、必要 API 的详细信息以及配置 Canton 以使用该驱动程序的步骤。

{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/migration/kms_migration.rst” hash=“024d318f” */}

迁移到 KMS

本节概述从正在运行的非 KMS 参与者迁移到启用 KMS 的参与者所需的步骤,以及使用 KMS 的节点与不使用 KMS 的节点之间的互操作性。迁移过程取决于所选的操作模式:

  1. 使用密钥管理服务 (KMS) 迁移到加密私钥存储

    此过程需要将节点配置为使用对称包密钥。 此配置步骤后,迁移将自动完成。

  2. 使用密钥管理服务 (KMS) 迁移到外部密钥存储

    此方法涉及创建一个新的启用 KMS 的参与者并从参与者节点传输所有数据(例如合同)。 该过程必须由每个操作员使用提供的脚本和函数手动执行。

    它提供了一个干净且独立的过渡,但需要更改命名空间并与所有受影响的参与者节点运营商进行协调。

{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/migration/encrypted_key_storage_migration.rst” hash=“81793b9d” */}# 迁移到使用 KMS 加密的私钥存储

要使用带有外部托管对称包密钥的 KMS 从非加密密钥存储迁移到加密私钥存储,您只需将参与者(或任何其他节点)配置为在此模式下运行,如此处所述。该过程是无缝的 - 重新启动参与者后,将采用新配置,并且 Canton 的私钥会自动加密和存储。

恢复加密的私钥存储

加密的私钥存储可以恢复为未加密的存储。为了防止意外恢复,只需删除private-key-store配置并不会恢复到未加密的存储。相反,必须添加以下配置,并重新启动节点:

canton.participants.participant1.crypto.private-key-store.encryption.reverted = true # default is false
这迫使 Canton 解密其私钥并以明文形式存储;不推荐。

通过删除reverted字段并重新配置KMS,可以再次启用加密私钥存储。

{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/migration/external_key_storage_migration.rst” hash=“00f0a330” */}

使用 KMS 迁移到外部密钥存储

创建具有连接到 KMS 兼容同步器的正确配置的新参与者(例如,使用 KMS 支持的加密和签名密钥运行 KMS 或 JCE)后,您必须将所有Party、活动合同和 DAR 从旧参与者转移到新参与者。两个参与者的身份不同,因此您需要重写合约以引用新的参与者 ID。通过此方法,您可以轻松地将运行较旧协议版本的旧参与者迁移到启用了 KMS 且可以运行较新协议版本的新参与者。此外,您不需要安全保存旧节点的根命名空间密钥,因为您的参与者命名空间发生了变化。然而,要使其发挥作用,单个运营商必须控制所有合同,或者所有参与者运营商必须同意此重写。

这仅适用于单个操作员,或者如果所有其他参与者操作员都同意并遵循相同的步骤。

首先,您必须在新参与者中重新创建旧参与者的所有Party,保持相同的显示名称,但由于新的命名空间键而导致不同的 id:

\#22917: 修复损坏的文字包括文字包括:: CANTON/enterprise/app/src/test/scala/com/digitalasset/canton/integration/tests/security/kms/KmsMigrationWithNewNamespaceIntegrationTest.scala 语言: scala start-after: user-manual-entry-begin: KmsRecreatePartiesInNewParticipantNewNs end-before: user-manual-entry-end: KmsRecreatePartiesInNewParticipantNewNs 缩进:

其次,您应该将 DAR 迁移到新参与者:

#22917: 修复损坏的文字包括文字包括:: CANTON/enterprise/app/src/test/scala/com/digitalasset/canton/integration/tests/security/kms/KmsMigrationWithNewNamespaceIntegrationTest.scala 语言: scala start-after: user-manual-entry-begin: KmsMigrateDarsNewNs end-before: user-manual-entry-end: KmsMigrateDarsNewNs 缩进:

最后,您需要将所有Party的有效合约从旧参与者转移到新参与者,并重写这些合约中提到的Party ID 以匹配新的Party ID。然后您可以连接到新的同步器:

\#22917: 修复损坏的文字包括文字包括:: CANTON/enterprise/app/src/test/scala/com/digitalasset/canton/integration/tests/security/kms/KmsMigrationWithNewNamespaceIntegrationTest.scala 语言: scala start-after: user-manual-entry-begin: KmsMigrateACSofPartiesNewNs end-before: user-manual-entry-end: KmsMigrateACSofPartiesNewNs 缩进:

结果是在不同的命名空间中出现一个新的参与者节点,其密钥由连接到同步器的 KMS 存储和管理,同步器可以使用适当的加密方案进行通信。

如果您想要将参与者迁移回使用 non-KMS 提供商,您需要遵循相同的步骤。

与其他节点的互操作性

默认情况下,Canton 节点使用jce 加密提供程序,该提供程序与使用外部 KMS 提供程序存储 Canton 私钥的其他节点兼容。如果您更改默认的jce提供商并使用不同的加密方案,则必须确保它支持与KMS提供商相同的算法和密钥方案,以便与其他启用KMS的Canton节点进行互操作。

有关 KMS 提供程序支持的加密方案和默认使用的加密方案的说明,请参阅支持的加密方案 参考。

{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/key_rotation/kms_key_rotation.rst” hash=“8b47170c” */}

使用 KMS 轮换密钥

Canton 支持在使用信封加密时轮换包密钥,以及轮换外部存储在 KMS 中的 Canton 密钥。

为了顺利进行灾难恢复,密钥轮换必须与备份交错进行,如备份和恢复中所述。

{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/key_rotation/rotate_wrapper_key.rst” hash=“dcb0594c” */}

旋转信封包键

一些 KMS 提供商(例如 AWS)提供对称 KMS 密钥的自动轮换(通常每年一次)。 Canton 通过允许节点管理员手动轮换 KMS 包器密钥来扩展此功能。

您可以在轮换期间通过在轮换包器密钥之前更新配置来更改密钥规范(例如,在 AWS 中启用多区域)。

密钥轮换不会删除先前的密钥。虽然旧密钥变得不活动,但它仍然保留。要永久删除以前的密钥,请参阅删除 Canton 节点密钥。

使用自动生成的密钥进行旋转

使用以下命令:```scala theme={“theme”:{“light”:“github-light”,“dark”:“github-dark”}} participant1.keys.secret.rotate_wrapper_key()


Canton 将使用配置的 KMS 自动创建新的包密钥。

## 使用手动生成的密钥进行轮换

首先,您必须在 KMS 中创建一个满足此处所述要求的新包密钥。之后,您可以使用以下命令轮换到该键:

```scala theme={"theme":{"light":"github-light","dark":"github-dark"}}
participant1.keys.secret.rotate_wrapper_key(newWrapperKeyId)
  • `newWrapperKeyId`:要旋转到的包器密钥的标识符。

{/* COPIED_START source=“docs-website:docs/replicated/canton/3.4/participant/howtos/secure/kms/key_rotation/rotate_external_keys.rst” hash=“f1a0d457” */}

轮换外部 KMS 密钥

即使 Canton 密钥外部存储在 KMS 中,仍然可以手动轮换。为此,您可以使用标准旋转密钥命令,或者如果您已经有要旋转到的预生成的 KMS 密钥,请运行以下命令:

val newSigningKeyParticipant = participant1.keys.secret
  .rotate_kms_node_key(
    keyFingerprint,
    newKmsKeyId,
    "kms_key_rotated",
  )
  • fingerprint - 我们想要旋转的密钥的指纹。
  • newKmsKeyId - 新 KMS 密钥的 ID(例如资源名称)。
  • name - 新密钥的可选名称。

当前的 KMS 服务不提供非对称密钥的自动轮换,因此节点运营商需要负责定期轮换这些密钥。


本文由 CC Privacy Club 根据 Canton Network 官方文档(CC-BY-4.0)整理翻译,仅供学习;实现细节以官方最新版本为准。