View a markdown version of this page

自带证书颁发机构 (BYOCA) - AWS Payment Cryptography

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

自带证书颁发机构 (BYOCA)

默认情况下,当服务内创建的非对称(RSA、ECC)密钥需要公钥证书时,这些证书由 AWS 支付加密和账户唯一证书颁发机构 (CA) 颁发。这旨在使其易于使用, X.509 无需识别或设置 CA 或管理证书签名请求 (CSR)。

AWS 支付密码学还允许您在出于政策或合规性原因需要时使用自己的 CA。

概述

使用 BYOCA,您可以使用自己的 CA 进行 TR-34 import/export、RSA Unwrap 和 ECDH 密钥传输。当您需要在整个组织中建立一致的证书链或合作伙伴需要特定的 CA 证书时,请使用 BYOCA。以下示例显示了 TR-34 密钥导出和 TR-34 密钥导入的 BYOCA 工作流程。

与标准 TR-34 流程有三个主要区别:

  1. 您可以使用创建 RSA 密钥。 CreateKey 之前,GetParametersForExport或者为你GetParametersForImport创建了它。

  2. GetCertificateSigningRequest API 会创建 CSR。然后,您的外部 CA 可以对其进行签名。

  3. ExportKey ImportKey API 在通话时接受证书。该令牌现在是可选的。

重要注意事项
  • 这些示例使用 RSA-2048 密钥并封装密 TDES-2KEY 钥。导出时 AES-128,请确保所有密钥均为 RSA-3072 或 RSA-4096。

  • 最常见的错误是SigningKeyIdentifier和表示的密钥SigningKeyCertificate不匹配。

BYOCA 导出工作流程

以下步骤演示了完整的 BYOCA TR-34 导出工作流程。

步骤 1:创建 RSA 密钥

首先,创建一个最终成为 KDH 签名证书的 RSA 密钥对。您可以添加标签来识别密钥的用途。

例创建用于签名的 RSA 密钥
$ aws payment-cryptography create-key --exportable \ --key-attributes KeyAlgorithm=RSA_2048,KeyUsage=TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE,KeyClass=ASYMMETRIC_KEY_PAIR,KeyModesOfUse='{Sign=True}'
{ "Key": { "KeyArn": "arn:aws:payment-cryptography:us-east-1:111122223333:key/xgmq6fs6uow736uc", "KeyAttributes": { "KeyUsage": "TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE", "KeyClass": "ASYMMETRIC_KEY_PAIR", "KeyAlgorithm": "RSA_2048", "KeyModesOfUse": { "Sign": true } }, "KeyCheckValue": "41E3723C", "KeyCheckValueAlgorithm": "SHA_1", "Enabled": true, "Exportable": true, "KeyState": "CREATE_COMPLETE", "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY" } }

请记下,KeyArn因为在下一步中将需要它。

第 2 步:生成证书签名请求

生成证书签名请求 (CSR),由您的外部 CA 使用 GetCertificateSigningRequest API 签署。输出是一个 base64 编码的 PEM 文件。如果您使用 base64 对内容进行解码并保存它们,则将获得 PEM 格式的有效 CSR。

例生成 CSR
$ aws payment-cryptography-data get-certificate-signing-request \ --key-identifier arn:aws:payment-cryptography:us-east-1:111122223333:key/xgmq6fs6uow736uc \ --signing-algorithm SHA512 \ --certificate-subject '{ "CommonName": "MyCertificateAWSUSEAST", "Organization": "Amazon", "OrganizationUnit": "PaymentCryptography", "Country": "US", "StateOrProvince": "Virginia", "City": "Arlington" }'
{ "CertificateSigningRequest": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0..." }

CertificateSigningRequest字段包含整个 PEM 文件,采用 base64 编码。PEM 文件包含-----BEGIN CERTIFICATE REQUEST-----和标-----END CERTIFICATE REQUEST-----记。将此值发送到您的 CA 进行签名。

第 3 步:查看 CSR(可选)

您可以选择使用 OpenSSL 来查看 CSR 内容并确保其有效且符合预期。

例使用 OpenSSL 审查 CSR
$ echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0..." | base64 -d | openssl req -text

第 4 步:使用证书颁发机构签署 CSR

生成 CSR 后,您需要让证书颁发机构 (CA) 对其进行签名。在生产环境中,您通常会使用 AWS 私有 CA 组织已建立的 CA 基础架构。出于测试目的,您可以使用 OpenSSL 创建自签名证书。

使用 AWS 私有 CA

要使用签署 CSR AWS 私有 CA,请先解码 base64 编码的 CSR 并将其保存到文件中,然后使用 API。 IssueCertificate

例使用以下方式签署 CSR AWS 私有 CA
$ echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0..." | base64 -d > csr.pem $ aws acm-pca issue-certificate \ --certificate-authority-arn arn:aws:acm-pca:us-east-1:111122223333:certificate-authority/12345678-1234-1234-1234-123456789012 \ --csr fileb://csr.pem \ --signing-algorithm SHA256WITHRSA \ --validity Value=365,Type=DAYS
{ "CertificateArn": "arn:aws:acm-pca:us-east-1:111122223333:certificate-authority/12345678-1234-1234-1234-123456789012/certificate/abcdef1234567890" }

然后检索已签名的证书:

例检索已签名的证书
$ aws acm-pca get-certificate \ --certificate-authority-arn arn:aws:acm-pca:us-east-1:111122223333:certificate-authority/12345678-1234-1234-1234-123456789012 \ --certificate-arn arn:aws:acm-pca:us-east-1:111122223333:certificate-authority/12345678-1234-1234-1234-123456789012/certificate/abcdef1234567890
{ "Certificate": "-----BEGIN CERTIFICATE-----\nMIID...\n-----END CERTIFICATE-----", "CertificateChain": "-----BEGIN CERTIFICATE-----\nMIID...\n-----END CERTIFICATE-----" }

保存证书内容以供导出步骤使用。在将其提供给 API 时,您需要对其进行 base64 编码。ExportKey

使用 OpenSSL 进行测试

出于测试目的,您可以使用 OpenSSL 创建自签名的 CA 并对 CSR 进行签名。首先,创建 CA 私钥和自签名证书:

例使用 OpenSSL 创建测试 CA
$ # Generate CA private key openssl genrsa -out ca-key.pem 4096 $ # Create self-signed CA certificate openssl req -new -x509 -days 3650 -key ca-key.pem -out ca-cert.pem \ -subj "/C=US/ST=Virginia/L=Arlington/O=TestOrg/CN=Test CA"

然后对上一步中的 CSR 进行解码,并使用您的测试 CA 对其进行签名:

例使用 OpenSSL 签署 CSR
$ # Decode the base64-encoded CSR echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0..." | base64 -d > csr.pem $ # Sign the CSR with the CA openssl x509 -req -in csr.pem -CA ca-cert.pem -CAkey ca-key.pem \ -CAcreateserial -out signed-cert.pem -days 365 -sha512
Certificate request self-signature ok subject=C=US, ST=Virginia, L=Arlington, O=Amazon, OU=PaymentCryptography, CN=MyCertificateAWSUSEAST

已签名的证书现已生效signed-cert.pem。将此证书提供给 API 时,您需要对该证书进行 base64 编码:ExportKey

例 Base64 对签名证书进行编码
$ cat signed-cert.pem | base64 -w 0

第 5 步:导入 CA 证书

要防止使用任意证书,必须首先信任正在使用的任何 CA。使用 ImportKey API 导入外部 CA 的根证书。如果使用中间 CA,请import-key再次调用,但TrustedPublicKey改为指定RootCertificatePublicKey并指定根 CA ARN。

例导入根 CA 证书
$ aws payment-cryptography import-key --key-material='{ "RootCertificatePublicKey": { "KeyAttributes": { "KeyAlgorithm": "RSA_4096", "KeyClass": "PUBLIC_KEY", "KeyModesOfUse": { "Verify": true }, "KeyUsage": "TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE" }, "PublicKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t..." } }'
{ "Key": { "KeyArn": "arn:aws:payment-cryptography:us-east-1:111122223333:key/xivpaqy7qbbm7cdw", "KeyAttributes": { "KeyUsage": "TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE", "KeyClass": "PUBLIC_KEY", "KeyAlgorithm": "RSA_4096", "KeyModesOfUse": { "Verify": true } }, "Enabled": true, "KeyState": "CREATE_COMPLETE", "KeyOrigin": "EXTERNAL" } }

记下导出步骤中使用的 KeyArn CA。

第 6 步:获取 KRD 加密证书

在此示例中,我们将导回 AWS 支付加密系统,因此我们调用该服务以使用 API 接收 KRD 公钥证书。 GetParametersForImport 在实际场景中,这将由其他系统提供,例如HSM、ATM、支付终端或支付终端管理系统。

例获取导入的参数
$ aws payment-cryptography-data get-parameters-for-import \ --key-material-type "TR34_KEY_BLOCK" \ --wrapping-key-algorithm RSA_2048
{ "WrappingKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...", "WrappingKeyCertificateChain": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...", "WrappingKeyAlgorithm": "RSA_2048", "ImportToken": "import-token-v2rxpl6drxeptn7w", "ParametersValidUntilTimestamp": "2025-11-01T18:45:31.271000-07:00" }

第 7 步:使用 BYOCA 导出密钥

最后,使用 ExportKey API 将密钥 TR-34 与您自己的 CA-signed 证书一起导出。提供由您的外部 CA 签名的签名证书。

例 TR-34 使用 BYOCA 导出
$ aws payment-cryptography-data export-key \ --export-key-identifier arn:aws:payment-cryptography:us-east-1:111122223333:key/iox73p5f4c4yjiod \ --key-material '{ "Tr34KeyBlock": { "CertificateAuthorityPublicKeyIdentifier": "arn:aws:payment-cryptography:us-east-1:111122223333:key/j625deyfqlwctu57", "SigningKeyIdentifier": "arn:aws:payment-cryptography:us-east-1:111122223333:key/xgmq6fs6uow736uc", "SigningKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...", "KeyBlockFormat": "X9_TR34_2012", "WrappingKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t..." } }'
{ "WrappedKey": { "WrappedKeyMaterialFormat": "TR34_KEY_BLOCK", "KeyMaterial": "3082055A06092A864886F70D010702A082054B30820547...", "KeyCheckValue": "3DCA31", "KeyCheckValueAlgorithm": "ANSI_X9_24" } }

现在,接收系统可以使用标准导入流程 TR-34 导入导出的密钥块。

BYOCA 导入工作流程

以下步骤将引导您完成 TR-34 密钥导入的 BYOCA 工作流程。使用此工作流程使用您自己的 CA-signed KRD(密钥接收设备)加密证书接收 AWS 付款加密密钥。通过 BYOCA 导入,您可以使用已经管理的 CA 来控制信任链。

步骤 1:创建 RSA 密钥

创建 RSA 密钥对用作 KRD 加密密钥。此密钥会在导入期间解封和解密传入的密钥。 TR-34 密钥不可导出,因为它作为接收密钥留在服务中。

例创建 KRD 加密密钥
$ aws payment-cryptography create-key \ --key-attributes KeyAlgorithm=RSA_2048,KeyUsage=TR31_K2_TR34_ASYMMETRIC_KEY,KeyClass=ASYMMETRIC_KEY_PAIR,KeyModesOfUse='{Unwrap=True,Decrypt=True}'
{ "Key": { "KeyArn": "arn:aws:payment-cryptography:us-east-1:111122223333:key/bm7t4qv8hzk24jce", "KeyAttributes": { "KeyUsage": "TR31_K2_TR34_ASYMMETRIC_KEY", "KeyClass": "ASYMMETRIC_KEY_PAIR", "KeyAlgorithm": "RSA_2048", "KeyModesOfUse": { "Unwrap": true, "Decrypt": true } }, "KeyCheckValue": "7FA29C1E", "KeyCheckValueAlgorithm": "SHA_1", "Enabled": true, "Exportable": false, "KeyState": "CREATE_COMPLETE", "KeyOrigin": "AWS_PAYMENT_CRYPTOGRAPHY" } }

记下 KeyArn 的值。您在下一个步骤中需要用到它。

步骤 2:生成证书签名请求

使用 GetCertificateSigningRequest API 为 KRD 加密密钥生成证书签名请求 (CSR)。输出是一个 base64 编码的 PEM 文件。如果您使用 base64 对内容进行解码并保存它们,则将获得 PEM 格式的有效 CSR。

例为 KRD 密钥生成 CSR
$ aws payment-cryptography-data get-certificate-signing-request \ --key-identifier arn:aws:payment-cryptography:us-east-1:111122223333:key/bm7t4qv8hzk24jce \ --signing-algorithm SHA512 \ --certificate-subject '{ "CommonName": "MyImportKRDCertAWSUSEAST", "Organization": "Amazon", "OrganizationUnit": "PaymentCryptography", "Country": "US", "StateOrProvince": "Virginia", "City": "Arlington" }'
{ "CertificateSigningRequest": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0..." }

CertificateSigningRequest字段包含整个 PEM 文件,采用 base64 编码。PEM 文件包含-----BEGIN CERTIFICATE REQUEST-----和标-----END CERTIFICATE REQUEST-----记。将此值发送到您的 CA 进行签名。

第 3 步:查看 CSR(可选)

您可以选择使用 OpenSSL 来查看 CSR 内容并确保其有效且符合预期。

例使用 OpenSSL 审查 CSR
$ echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0..." | base64 -d | openssl req -text

第 4 步:使用证书颁发机构签署 CSR

生成 CSR 后,请由证书颁发机构 (CA) 对其进行签名。在生产环境中,您通常会使用 AWS 私有 CA 组织已建立的 CA 基础架构。出于测试目的,您可以使用 OpenSSL 创建自签名证书。

使用 AWS 私有 CA

要使用签署 CSR AWS 私有 CA,请先解码 base64 编码的 CSR 并将其保存到文件中,然后使用 API。 IssueCertificate

例使用以下方式签署 CSR AWS 私有 CA
$ echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0..." | base64 -d > krd-csr.pem $ aws acm-pca issue-certificate \ --certificate-authority-arn arn:aws:acm-pca:us-east-1:111122223333:certificate-authority/12345678-1234-1234-1234-123456789012 \ --csr fileb://krd-csr.pem \ --signing-algorithm SHA256WITHRSA \ --validity Value=365,Type=DAYS
{ "CertificateArn": "arn:aws:acm-pca:us-east-1:111122223333:certificate-authority/12345678-1234-1234-1234-123456789012/certificate/fedcba0987654321" }

然后检索已签名的证书:

例检索已签名的证书
$ aws acm-pca get-certificate \ --certificate-authority-arn arn:aws:acm-pca:us-east-1:111122223333:certificate-authority/12345678-1234-1234-1234-123456789012 \ --certificate-arn arn:aws:acm-pca:us-east-1:111122223333:certificate-authority/12345678-1234-1234-1234-123456789012/certificate/fedcba0987654321
{ "Certificate": "-----BEGIN CERTIFICATE-----\nMIID...\n-----END CERTIFICATE-----", "CertificateChain": "-----BEGIN CERTIFICATE-----\nMIID...\n-----END CERTIFICATE-----" }

保存证书内容以供导入步骤使用。 Base64-encode 将其提供给 ImportKey API 之前的证书。

使用 OpenSSL 进行测试

出于测试目的,您可以使用 OpenSSL 创建自签名的 CA 并对 CSR 进行签名。首先,创建 CA 私钥和自签名证书:

例使用 OpenSSL 创建测试 CA
$ # Generate CA private key openssl genrsa -out ca-key.pem 4096 $ # Create self-signed CA certificate openssl req -new -x509 -days 3650 -key ca-key.pem -out ca-cert.pem \ -subj "/C=US/ST=Virginia/L=Arlington/O=TestOrg/CN=Test CA"

然后对上一步中的 CSR 进行解码,并使用您的测试 CA 对其进行签名:

例使用 OpenSSL 签署 CSR
$ # Decode the base64-encoded CSR echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0..." | base64 -d > krd-csr.pem $ # Sign the CSR with the CA openssl x509 -req -in krd-csr.pem -CA ca-cert.pem -CAkey ca-key.pem \ -CAcreateserial -out krd-signed-cert.pem -days 365 -sha512
Certificate request self-signature ok subject=C=US, ST=Virginia, L=Arlington, O=Amazon, OU=PaymentCryptography, CN=MyImportKRDCertAWSUSEAST

已签名的证书现已生效krd-signed-cert.pem。 Base64-encode 在向 ImportKey API 提供此证书之前:

例 Base64 对签名证书进行编码
$ cat krd-signed-cert.pem | base64 -w 0

第 5 步:导入 CA 证书

在使用 CA 之前,必须先信任它。使用 ImportKey API 导入外部 CA 的根证书。如果使用中间 CA,请import-key再次调用,但TrustedPublicKey改为指定RootCertificatePublicKey并指定根 CA ARN。

例导入根 CA 证书
$ aws payment-cryptography import-key --key-material='{ "RootCertificatePublicKey": { "KeyAttributes": { "KeyAlgorithm": "RSA_4096", "KeyClass": "PUBLIC_KEY", "KeyModesOfUse": { "Verify": true }, "KeyUsage": "TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE" }, "PublicKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t..." } }'
{ "Key": { "KeyArn": "arn:aws:payment-cryptography:us-east-1:111122223333:key/nqr3c5v2wp6yl8az", "KeyAttributes": { "KeyUsage": "TR31_S0_ASYMMETRIC_KEY_FOR_DIGITAL_SIGNATURE", "KeyClass": "PUBLIC_KEY", "KeyAlgorithm": "RSA_4096", "KeyModesOfUse": { "Verify": true } }, "Enabled": true, "KeyState": "CREATE_COMPLETE", "KeyOrigin": "EXTERNAL" } }

记下导入步骤中使用的 KeyArn CA。

第 6 步:从发送系统获取 KDH 签名证书

在 TR-34 密钥交换中,发送方(密钥分发主机或 KDH)提供其公钥证书以供签名。此证书用于在导入期间验证封装密钥块上的签名,确保密钥材料来自可信发件人。在生产中,该证书通常通过其自己的证书分发流程来自发送系统,例如 HSM、支付终端或密钥管理系统。

在本示例中,您使用 AWS 支付加密作为发送方和接收方,以简化步骤。GetParametersForExport致电获取通常由发送系统提供的 KDH 签名证书。

例获取导出参数
$ aws payment-cryptography-data get-parameters-for-export \ --key-material-type "TR34_KEY_BLOCK" \ --signing-key-algorithm RSA_2048
{ "ExportToken": "export-token-k8sfhe2w9rjy4bx6", "SigningKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...", "SigningKeyCertificateChain": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...", "SigningKeyAlgorithm": "RSA_2048", "ParametersValidUntilTimestamp": "2025-11-01T18:45:31.271000-07:00" }

记下ExportToken和,SigningKeyCertificate以便在导入步骤中使用。

第 7 步:使用 BYOCA 导入密钥

最后,使用 ImportKey API 将密钥 TR-34 与您自己的 CA-signed 证书一起导入。提供由您的外部 CA 签署的 KRD 加密证书。

使用 2-pass TR-34 时,该RandomNonce参数是必需的。该服务不会为您生成随机数,它是您生成的随机十六进制值,发送端和接收端必须相同。使用 1-pass TR-34 (依赖于时间戳而不是随机数)时,时间戳不得在将来。该服务不会验证任何特定的新鲜度(例如,在一定小时内),但您可以根据需要强制执行新鲜度检查。

例 TR-34 使用 BYOCA 导入
$ aws payment-cryptography import-key --key-material='{ "Tr34KeyBlock": { "CertificateAuthorityPublicKeyIdentifier": "arn:aws:payment-cryptography:us-east-1:111122223333:key/nqr3c5v2wp6yl8az", "KeyBlockFormat": "X9_TR34_2012", "RandomNonce": "4997FBB4587D571F", "SigningKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...", "WrappingKeyCertificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0t...", "WrappingKeyIdentifier": "arn:aws:payment-cryptography:us-east-1:111122223333:key/bm7t4qv8hzk24jce", "WrappedKeyBlock": "D0112B0AX00E0000B82679114F470F540165EDFBF407..." } }'
{ "Key": { "KeyArn": "arn:aws:payment-cryptography:us-east-1:111122223333:key/gwz7u3rfxd4o52sb", "KeyAttributes": { "KeyUsage": "TR31_K0_KEY_ENCRYPTION_KEY", "KeyClass": "SYMMETRIC_KEY", "KeyAlgorithm": "TDES_2KEY", "KeyModesOfUse": { "Encrypt": true, "Decrypt": true } }, "KeyCheckValue": "3DCA31", "KeyCheckValueAlgorithm": "ANSI_X9_24", "Enabled": true, "Exportable": true, "KeyState": "CREATE_COMPLETE", "KeyOrigin": "EXTERNAL" } }

该密钥现已导入 AWS 支付加密系统并可供使用。该KeyOrigin字段显示EXTERNAL表明密钥来自服务外部。

附加说明

  • 这些示例使用 AWS CLI 显示。所有 AWS 开发工具包都提供相同的功能,包括 Java、Python、Go 和 Rust。

  • 如果您使用自签名的 CA 进行测试,则可以使用 OpenSSL 创建测试 CA 并签署 CSR。在生产中,使用贵组织已建立的 CA 基础架构。