本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
自带证书颁发机构 (BYOCA)
默认情况下,当服务中创建的非对称(RSA、ECC)密钥需要公钥证书时,这些证书由 AWS 支付密码学和账户唯一证书颁发机构 (CA) 颁发。这旨在简化使用 X.509,而不必承担识别或设置 CA 或管理证书签名请求 (CSR) 的负担。
AWS Payment Cryptography 还允许您在出于政策或合规原因需要时使用您自己的 CA。
概述
BYOCA 功能允许您在任何使用证书的地方使用自己的证书颁发机构,包括 TR-34 导入/导出、RSA Unwrap 和基于 ECDH 的密钥传输。当您需要在整个组织中维护一致的证书链或与需要特定 CA 证书的合作伙伴合作时,这非常有用。以下示例演示了使用 TR-34 密钥导出的 BYOCA 工作流程。
与标准 TR-34 导出流程相比,三个主要区别是:
-
签名 RSA 密钥是使用CreateKey显式创建的。以前,它是通过GetParametersForExport隐式创建的。
-
新的 API GetCertificateSigningRequest会创建证书签名请求 (CSR),该请求可由您的外部 CA 签名。
-
ExportKeyAPI 已扩展为允许在运行时提供证书。以前,这是由隐式提供的
import-token,它变成了可选字段。
重要注意事项
-
这些示例使用 RSA-2048 密钥并封装一个 TDES-2KEY 密钥。导出 AES-128 时,请确保所有密钥都是 RSA-3072 或 RSA-4096。
-
最常见的错误是
SigningKeyIdentifier和表示的密钥SigningKeyCertificate不匹配。
BYOCA 工作流程
以下步骤演示了 TR-34 导出的完整 BYOCA 工作流程。
Steps
步骤 1:创建 RSA 密钥
首先,创建一个 RSA 密钥对,该密钥对最终将成为 KDH 签名证书。您可以添加标签来标识密钥的用途。
例创建用于签名的 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:生成证书签名请求
使用 GetCertificateSigningRequestAPI 生成证书签名请求 (CSR),由您的外部 CA 签名。输出是一个 base64 编码的 PEM 文件。如果您对内容进行 base64 解码并保存,则将获得一个 PEM 格式的有效 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字段包含 base64 编码的 CSR,您将发送给您的 CA 进行签名。
步骤 3:查看 CSR(可选)
您可以选择使用 OpenSSL 来查看 CSR 内容并确保其有效且符合预期。
例使用 OpenSSL 查看企业社会责任
$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,以防止使用任意证书。使用 ImportKeyAPI 导入外部 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" } }
记下要在导出步骤中使用的 CA。KeyArn
步骤 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 导出密钥
最后,使用 API 使用 TR-34 导出带有您自己的 CA 签名证书的ExportKey密钥。提供由您的外部 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 导入流程导入导出的密钥块。
附加说明
-
这些示例是使用 AWS CLI 显示的。所有 AWS 都提供相同的功能, SDKs 包括 Java、Python、Go 和 Rust。
-
如果您使用自签名 CA 进行测试,则可以使用 OpenSSL 创建测试 CA 并签署 CSR。在生产环境中,使用贵组织已建立的 CA 基础架构。