

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

# 自带证书颁发机构 (BYOCA)
<a name="keyexchange-byoca"></a>

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

AWS Payment Cryptography 还允许您在出于政策或合规原因需要时使用您自己的 CA。

## 概述
<a name="keyexchange-byoca.overview"></a>

BYOCA 功能允许您在任何使用证书的地方使用自己的证书颁发机构，包括 TR-34 import/export RSA Unwrap 和密钥传输。 ECDH-based 当您需要在整个组织中维护一致的证书链或与需要特定 CA 证书的合作伙伴合作时，这非常有用。以下示例演示了使用 TR-34 密钥导出的 BYOCA 工作流程。

与标准 TR-34 出口流程相比，三个主要区别是：

1. 签名 RSA 密钥是使用[CreateKey](https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_CreateKey.html)显式创建的。以前，它是通过[GetParametersForExport](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GetParametersForExport.html)隐式创建的。

1. 新的 API [GetCertificateSigningRequest](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GetCertificateSigningRequest.html)会创建证书签名请求 (CSR)，该请求可由您的外部 CA 签名。

1. [ExportKey](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_ExportKey.html)API 已扩展为允许在运行时提供证书。以前，这是由隐式提供的`import-token`，它变成了可选字段。

**重要注意事项**  
这些示例使用 RSA-2048 密钥并封装密 TDES-2KEY 钥。导出时 AES-128，请确保所有密钥均为 RSA-3072 或 RSA-4096。
最常见的错误是`SigningKeyIdentifier`和表示的密钥`SigningKeyCertificate`不匹配。

## BYOCA 工作流程
<a name="keyexchange-byoca.workflow"></a>

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

**Topics**
+ [步骤 1：创建 RSA 密钥](#keyexchange-byoca.create-rsa)
+ [步骤 2：生成证书签名请求](#keyexchange-byoca.generate-csr)
+ [步骤 3：查看 CSR（可选）](#keyexchange-byoca.review-csr)
+ [步骤 4：与证书颁发机构签署 CSR](#keyexchange-byoca.sign-csr)
+ [步骤 5：导入 CA 证书](#keyexchange-byoca.import-ca)
+ [步骤 6：获取 KRD 加密证书](#keyexchange-byoca.get-krd)
+ [第 7 步：使用 BYOCA 导出密钥](#keyexchange-byoca.export-key)

### 步骤 1：创建 RSA 密钥
<a name="keyexchange-byoca.create-rsa"></a>

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

**Example 创建用于签名的 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：生成证书签名请求
<a name="keyexchange-byoca.generate-csr"></a>

使用 [GetCertificateSigningRequest](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GetCertificateSigningRequest.html)API 生成证书签名请求 (CSR)，由您的外部 CA 签名。输出是一个 base64 编码的 PEM 文件。如果您对内容进行 base64 解码并保存，则将获得一个 PEM 格式的有效 CSR。

**Example 生成企业社会责任**  

```
$ 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（可选）
<a name="keyexchange-byoca.review-csr"></a>

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

**Example 使用 OpenSSL 查看企业社会责任**  

```
$ echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0..." | base64 -d | openssl req -text
```

### 步骤 4：与证书颁发机构签署 CSR
<a name="keyexchange-byoca.sign-csr"></a>

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

#### 使用 AWS 私有 CA
<a name="keyexchange-byoca.sign-csr-pca"></a>

要使用签署 CSR AWS 私有 CA，请先解码 base64 编码的 CSR 并将其保存到文件中，然后使用 API。[IssueCertificate](https://docs.aws.amazon.com/acm-pca/latest/APIReference/API_IssueCertificate.html)

**Example 与之签署 CSR AWS Private 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"
}
```

然后检索签名的证书：

**Example 检索签名证书**  

```
$ 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 进行测试
<a name="keyexchange-byoca.sign-csr-openssl"></a>

出于测试目的，您可以使用 OpenSSL 创建自签名 CA 并签署 CSR。首先，创建 CA 私钥和自签名证书：

**Example 使用 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 进行签名：

**Example 使用 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`

**Example Base64 对签名的证书进行编码**  

```
$ cat signed-cert.pem | base64 -w 0
```

### 步骤 5：导入 CA 证书
<a name="keyexchange-byoca.import-ca"></a>

必须首先信任正在使用的任何 CA，以防止使用任意证书。使用 [ImportKey](https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_ImportKey.html)API 导入外部 CA 的根证书。如果使用中间 CA，请`import-key`再次调用，但要`TrustedPublicKey`改为指定`RootCertificatePublicKey`并指定根 CA ARN。

**Example 导入根 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 加密证书
<a name="keyexchange-byoca.get-krd"></a>

在此示例中，我们正在重新导入 AWS 支付密码学，因此我们调用该服务以使用 API 接收 KRD 公钥证书。[GetParametersForImport](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GetParametersForImport.html)在实际场景中，这将由其他系统提供，例如HSM、ATM、支付终端或支付终端管理系统。

**Example 获取导入的参数**  

```
$ 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 导出密钥
<a name="keyexchange-byoca.export-key"></a>

最后，使用 [ExportKey](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_ExportKey.html)API 将密钥 TR-34 与您自己的 CA-signed 证书一起导出。提供由您的外部 CA 签名的签名证书。

**Example 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 入导出的密钥块。

## 附加说明
<a name="keyexchange-byoca.notes"></a>
+ 这些示例是使用 AWS CLI 显示的。所有 AWS 软件开发工具包都提供相同的功能，包括 Java、Python、Go 和 Rust。
+ 如果您使用自签名 CA 进行测试，则可以使用 OpenSSL 创建测试 CA 并签署 CSR。在生产环境中，使用贵组织已建立的 CA 基础架构。