导入密钥 - AWS 支付密码学

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

导入密钥

重要

示例需要最新版本的 AWS CLI V2。在开始之前,请确保您已升级到最新版本

导入对称密钥

使用非对称技术导入密钥 (TR-34)

AWS 付款密码学密钥加密密钥导入流程

TR-34 使用 RSA 非对称加密技术对对称密钥进行加密和签名以进行交换。这样可以确保封装密钥的机密性(加密)和完整性(签名)。

要导入自己的密钥,请查看上GitHub的 “ AWS 支付密码学” 示例项目。有关如何从其他平台导入/导出密钥的说明,请查看这些平台上的示例代码GitHub或查阅这些平台的用户指南。

  1. 调用 “初始化导入” 命令

    调用 get-parameters-for-import 以初始化导入过程。此 API 为密钥导入生成密钥对,对密钥进行签名,然后返回证书和证书根。使用此密钥加密要导出的密钥。在 TR-34 术语中,这被称为 KRD 证书。这些证书采用 base64 编码,寿命短,仅用于此目的。保存该ImportToken值。

    $ aws payment-cryptography get-parameters-for-import \ --key-material-type TR34_KEY_BLOCK \ --wrapping-key-algorithm RSA_2048
    { "ImportToken": "import-token-bwxli6ocftypneu5", "ParametersValidUntilTimestamp": 1698245002.065, "WrappingKeyCertificateChain": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0....", "WrappingKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0....", "WrappingKeyAlgorithm": "RSA_2048" }
  2. 在密钥源系统上安装公共证书

    大多数情况下 HSMs,您需要安装、加载或信任步骤 1 中生成的公共证书才能使用它导出密钥。这可能包括整个证书链,或者仅包括步骤 1 中的根证书,具体取决于 HSM。

  3. 在源系统上生成 key pair 并为 AWS 支付密码学提供证书链

    为确保传输的有效载荷的完整性,发送方(密钥分发主机或 KDH)对其进行签名。为此生成公钥并创建公钥证书 (X509) 以提供给 AWS 支付密码学。

    从 HSM 传输密钥时,请在该 HSM 上创建密钥对。HSM、第三方或诸如之类的服务 AWS Private CA 可以生成证书。

    使用带 KeyMaterialType 有 of RootCertificatePublicKey 和 of 的importKey命令将根证书加载到 AWS 支付密码中 KeyUsageType 。TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE

    对于中间证书,请使用带有 importKey of TrustedCertificatePublicKey 和 of KeyMaterialType KeyUsageType 的命令TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE。对多个中间证书重复此过程。使用链KeyArn中最后一次导入的证书作为后续导入命令的输入。

    注意

    不要导入树叶证书。在导入命令期间直接提供它。

  4. 从源系统导出密钥

    许多 HSMs 及相关系统都支持使用 TR-34 标准导出密钥。将步骤 1 中的公钥指定为 KRD(加密)证书,将步骤 3 中的密钥指定为 KDH(签名)证书。要导入到 Paym AWS ent Cryptography,请将格式指定为 TR-34.2012 非 CMS 双通格式,也可以称为 TR-34 Diebold 格式。

  5. 呼叫导入密钥

    使用 of 调用 ImportKey API KeyMaterialType 。TR34_KEY_BLOCK使用步骤 3 中导入的最后一个 CA 的 KeyArncertificate-authority-public-key-identifier,将步骤 4 中的封装密钥材料用于key-material,使用步骤 3 中的叶子证书。signing-key-certificate包括步骤 1 中的导入令牌。

    $ aws payment-cryptography import-key \ --key-material='{"Tr34KeyBlock": { \ "CertificateAuthorityPublicKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/zabouwe3574jysdl", \ "ImportToken": "import-token-bwxli6ocftypneu5", \ "KeyBlockFormat": "X9_TR34_2012", \ "SigningKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUV2RENDQXFTZ0F3SUJ...", \ "WrappedKeyBlock": "308205A106092A864886F70D010702A08205923082058E020101310D300B0609608648016503040201308203..."} \ }'
    { "Key": { "CreateTimestamp": "2023-06-13T16:52:52.859000-04:00", "Enabled": true, "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ov6icy4ryas4zcza", "KeyAttributes": { "KeyAlgorithm": "TDES_3KEY", "KeyClass": "SYMMETRIC_KEY", "KeyModesOfUse": { "Decrypt": true, "DeriveKey": false, "Encrypt": true, "Generate": false, "NoRestrictions": false, "Sign": false, "Unwrap": true, "Verify": false, "Wrap": true }, "KeyUsage": "TR31_K1_KEY_ENCRYPTION_KEY" }, "KeyCheckValue": "CB94A2", "KeyCheckValueAlgorithm": "ANSI_X9_24", "KeyOrigin": "EXTERNAL", "KeyState": "CREATE_COMPLETE", "UsageStartTimestamp": "2023-06-13T16:52:52.859000-04:00" } }
  6. 使用导入的密钥进行加密操作或后续导入

    如果导入 KeyUsage 的是 TR31 _K0_KEY_ENCRYPTION_KEY,则可以使用 TR-31 将此密钥用于后续的密钥导入。对于其他密钥类型(例如 TR31 _D0_SYMMETRIC_DATA_ENCRYPTION_KEY),您可以直接使用该密钥进行加密操作。

使用非对称技术导入密钥(RSA Unwrap)

概述:当 TR-34 不可行时,P AWS ayment Cryptography 支持 RSA 封装/解包进行密钥交换。与 TR-34 一样,此技术使用 RSA 非对称加密来加密对称密钥以进行交换。但是,与 TR-34 不同,此方法不让发送方签署有效载荷。此外,这种 RSA 封装技术无法在传输过程中保持密钥元数据的完整性,因为它不包括密钥块。

注意

您可以使用 RSA 封装来导入或导出 TDES 和 AES-128 密钥。

  1. 调用 “初始化导入” 命令

    调用get-parameters-for-import以初始化导入过程KEY_CRYPTOGRAMKeyMaterialTypeRSA_2048用于交换 TDES 密钥WrappingKeyAlgorithm时使用。RSA_4096在交换 TDES 或 AES-128 密钥时使用RSA_3072或。此 API 为密钥导入生成密钥对,使用证书根对密钥进行签名,并返回证书和证书根。使用此密钥加密要导出的密钥。这些证书是短暂的,仅用于此目的。

    $ aws payment-cryptography get-parameters-for-import \ --key-material-type KEY_CRYPTOGRAM \ --wrapping-key-algorithm RSA_4096
    { "ImportToken": "import-token-bwxli6ocftypneu5", "ParametersValidUntilTimestamp": 1698245002.065, "WrappingKeyCertificateChain": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0....", "WrappingKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0....", "WrappingKeyAlgorithm": "RSA_4096" }
  2. 在密钥源系统上安装公共证书

    对于许多证书 HSMs,您需要安装、加载或信任步骤 1 中生成的公共证书(和/或其根证书),才能使用它导出密钥。

  3. 从源系统导出密钥

    许多 HSMs 及相关系统都支持使用 RSA 封装导出密钥。将步骤 1 中的公钥指定为加密证书 (WrappingKeyCertificate)。如果您需要信任链,请使用 fro WrappingKeyCertificateChain m 步骤 1。从 HSM 导出密钥时,将格式指定为 RSA,填充模式 = PKCS #1 v2.2 OAEP(使用 SHA 256 或 SHA 512)。

  4. 打电话 import-key

    使用 of 调用 import-key API KeyMaterialKeyMaterialType你需要步骤 1 ImportToken 中的和步骤 3 中的key-material(包装好的密钥材料)。请提供密钥参数(例如密钥用法),因为 RSA wrap 不使用密钥块。

    $ cat import-key-cryptogram.json
    { "KeyMaterial": { "KeyCryptogram": { "Exportable": true, "ImportToken": "import-token-bwxli6ocftypneu5", "KeyAttributes": { "KeyAlgorithm": "AES_128", "KeyClass": "SYMMETRIC_KEY", "KeyModesOfUse": { "Decrypt": true, "DeriveKey": false, "Encrypt": true, "Generate": false, "NoRestrictions": false, "Sign": false, "Unwrap": true, "Verify": false, "Wrap": true }, "KeyUsage": "TR31_K0_KEY_ENCRYPTION_KEY" }, "WrappedKeyCryptogram": "18874746731....", "WrappingSpec": "RSA_OAEP_SHA_256" } } }
    $ aws payment-cryptography import-key --cli-input-json file://import-key-cryptogram.json
    { "Key": { "KeyOrigin": "EXTERNAL", "Exportable": true, "KeyCheckValue": "DA1ACF", "UsageStartTimestamp": 1697643478.92, "Enabled": true, "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/kwapwa6qaifllw2h", "CreateTimestamp": 1697643478.92, "KeyState": "CREATE_COMPLETE", "KeyAttributes": { "KeyAlgorithm": "AES_128", "KeyModesOfUse": { "Encrypt": true, "Unwrap": true, "Verify": false, "DeriveKey": false, "Decrypt": true, "NoRestrictions": false, "Sign": false, "Wrap": true, "Generate": false }, "KeyUsage": "TR31_K0_KEY_ENCRYPTION_KEY", "KeyClass": "SYMMETRIC_KEY" }, "KeyCheckValueAlgorithm": "CMAC" } }
  5. 使用导入的密钥进行加密操作或后续导入

    如果导入KeyUsage的是TR31_K0_KEY_ENCRYPTION_KEY,则可以使用 TR-31 使用此密钥进行后续密钥导入。如果密钥类型为任何其他类型(例如TR31_D0_SYMMETRIC_DATA_ENCRYPTION_KEY),则可以直接使用该密钥进行加密操作。

使用预先建立的密钥交换密钥导入对称密钥 (TR-31)

AWS 支付密码学对称密钥导入流程

交换多个密钥或支持密钥轮换时,合作伙伴通常首先交换初始密钥加密密钥 (KEK)。您可以使用诸如 paper 密钥组件之类的技术来做到这一点,或者对于 AWS 支付密码学,可以使用 TR-34

建立 KEK 后,您可以使用它来传输后续密钥(包括其他 KEKs)。 AWS Payment Cryptography 使用 ANSI TR-31 支持这种密钥交换,HSM 供应商广泛使用和支持。

  1. 导入密钥加密密钥 (KEK)

    确保你已经导入了 KEK 并有 KeyArn(或 keyAlias)可用。

  2. 在源平台上创建密钥

    如果密钥不存在,请在源平台上创建密钥。或者,您可以在 “ AWS 支付密码学” 上创建密钥并使用export命令。

  3. 从源平台导出密钥

    导出时,将导出格式指定为 TR-31。源平台将要求提供要导出的密钥和要使用的密钥加密密钥。

  4. 导入 AWS 支付密码学

    调用import-key命令时,请使用密钥加密密钥的 KeyArn(或别名)。WrappingKeyIdentifier将源平台的输出用于WrappedKeyBlock

    $ aws payment-cryptography import-key \ --key-material='{"Tr31KeyBlock": { \ "WrappingKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ov6icy4ryas4zcza", \ "WrappedKeyBlock": "D0112B0AX00E00002E0A3D58252CB67564853373D1EBCC1E23B2ADE7B15E967CC27B85D5999EF58E11662991FF5EB1381E987D744334B99D"} \ }'
    { "Key": { "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/kwapwa6qaifllw2h", "KeyAttributes": { "KeyUsage": "TR31_D0_SYMMETRIC_DATA_ENCRYPTION_KEY", "KeyClass": "SYMMETRIC_KEY", "KeyAlgorithm": "AES_128", "KeyModesOfUse": { "Encrypt": true, "Decrypt": true, "Wrap": true, "Unwrap": true, "Generate": false, "Sign": false, "Verify": false, "DeriveKey": false, "NoRestrictions": false } }, "KeyCheckValue": "0A3674", "KeyCheckValueAlgorithm": "CMAC", "Enabled": true, "Exportable": true, "KeyState": "CREATE_COMPLETE", "KeyOrigin": "EXTERNAL", "CreateTimestamp": "2023-06-02T07:38:14.913000-07:00", "UsageStartTimestamp": "2023-06-02T07:38:14.857000-07:00" } }

导入非对称 (RSA) 密钥

导入 RSA 公钥

AWS 支付密码学支持将 RSA 公钥作为 X.509 证书导入。要导入证书,请先导入其根证书。所有证书在导入时必须处于未过期状态。证书应采用 PEM 格式并采用 base64 编码。

  1. 将根证书导入 AWS 支付密码学

    使用以下命令导入根证书:

    $ aws payment-cryptography import-key \ --key-material='{"RootCertificatePublicKey": { \ "KeyAttributes": { \ "KeyAlgorithm": "RSA_2048", \ "KeyClass": "PUBLIC_KEY", \ "KeyModesOfUse": { \ "Verify": true}, \ "KeyUsage": "TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE"}, \ "PublicKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURKVENDQWcyZ0F3SUJBZ0lCWkRBTkJna3Foa2lHOXcwQkFR..."} \ }'
    { "Key": { "CreateTimestamp": "2023-08-08T18:52:01.023000+00:00", "Enabled": true, "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/zabouwe3574jysdl", "KeyAttributes": { "KeyAlgorithm": "RSA_2048", "KeyClass": "PUBLIC_KEY", "KeyModesOfUse": { "Decrypt": false, "DeriveKey": false, "Encrypt": false, "Generate": false, "NoRestrictions": false, "Sign": false, "Unwrap": false, "Verify": true, "Wrap": false }, "KeyUsage": "TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE" }, "KeyOrigin": "EXTERNAL", "KeyState": "CREATE_COMPLETE", "UsageStartTimestamp": "2023-08-08T18:52:01.023000+00:00" } }
  2. 将公钥证书导入 AWS 支付密码学

    现在,您可以导入公钥。有两种导入公钥的选项:

    • TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE如果密钥的目的是验证签名(例如,使用 TR-34 导入时),则使用。

    • TR31_D1_ASYMMETRIC_KEY_FOR_DATA_ENCRYPTION在加密数据以供其他系统使用时使用。

    $ aws payment-cryptography import-key \ --key-material='{"Tr31KeyBlock": { \ "WrappingKeyIdentifier": "arn:aws:payment-cryptography:us-east-2:111122223333:key/ov6icy4ryas4zcza", \ "WrappedKeyBlock": "D0112B0AX00E00002E0A3D58252CB67564853373D1EBCC1E23B2ADE7B15E967CC27B85D5999EF58E11662991FF5EB1381E987D744334B99D"} \ }'
    { "Key": { "CreateTimestamp": "2023-08-08T18:55:46.815000+00:00", "Enabled": true, "KeyArn": "arn:aws:payment-cryptography:us-east-2:111122223333:key/4kd6xud22e64wcbk", "KeyAttributes": { "KeyAlgorithm": "RSA_4096", "KeyClass": "PUBLIC_KEY", "KeyModesOfUse": { "Decrypt": false, "DeriveKey": false, "Encrypt": false, "Generate": false, "NoRestrictions": false, "Sign": false, "Unwrap": false, "Verify": true, "Wrap": false }, "KeyUsage": "TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE" }, "KeyOrigin": "EXTERNAL", "KeyState": "CREATE_COMPLETE", "UsageStartTimestamp": "2023-08-08T18:55:46.815000+00:00" } }