

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 自攜憑證授權機構 (BYOCA)
<a name="keyexchange-byoca"></a>

根據預設，當服務內建立的非對稱 (RSA，ECC) 金鑰需要公有金鑰憑證時，這些憑證是由 AWS 付款密碼編譯和帳戶唯一憑證授權機構 (CA) 發行。這是為了讓您更輕鬆地使用 X.509，而無須負擔識別或設定 CA 或管理憑證簽署請求 (CSR) 的負擔。

AWS 當基於政策或合規原因而需要時，付款密碼編譯也可讓您使用自己的 CA。

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

BYOCA 功能可讓您在使用憑證的任何位置使用自己的憑證授權機構，包括 TR-34 匯入/匯出、RSA Unwrap 和 ECDH 型金鑰傳輸。當您需要在整個組織中維持一致的憑證鏈，或與需要特定 CA 憑證的合作夥伴合作時，這非常有用。下列範例示範使用 TR-34 金鑰匯出的 BYOCA 工作流程。

相較於標準 TR-34 匯出流程的三個主要差異如下：

1. 使用 [CreateKey](https://docs.aws.amazon.com/payment-cryptography/latest/APIReference/API_CreateKey.html) 明確建立簽署 RSA 金鑰。先前透過 [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) 會建立可由外部 CA 簽署的憑證簽署請求 (CSR)。

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>

下列步驟示範 TR-34 匯出的完整 BYOCA 工作流程。

**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>

首先，建立最終將成為 KDH 簽署憑證的 RSA 金鑰對。您可以新增標籤來識別金鑰的用途。

**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 產生外部 CA 要簽署的憑證簽署請求 (CSR)。輸出是 base64 編碼的 PEM 檔案。如果您 base64 解碼並儲存內容，您將擁有 PEM 格式的有效 CSR。

**Example 產生 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` 欄位包含您將傳送給 CA 進行簽署的 base64 編碼 CSR。

### 步驟 3：檢閱 CSR （選用）
<a name="keyexchange-byoca.review-csr"></a>

您可以選擇性地使用 OpenSSL 來檢閱 CSR 內容，並確保其有效且如預期。

**Example 使用 OpenSSL 檢閱 CSR**  

```
$ 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，並將其儲存至檔案，然後使用 [IssueCertificate](https://docs.aws.amazon.com/acm-pca/latest/APIReference/API_IssueCertificate.html) API。

**Example 使用 簽署 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"
}
```

然後擷取已簽章的憑證：

**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-----"
}
```

儲存憑證內容以用於匯出步驟。將 Base64 提供給 `ExportKey` API 時，您將需要對其進行 Base64 編碼。

#### 使用 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`。在將此憑證提供給 `ExportKey` API 時，您需要對憑證進行 base64 編碼：

**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 付款密碼編譯，因此我們呼叫 服務，使用 [GetParametersForImport](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_GetParametersForImport.html) API 接收 KRD 公有金鑰憑證。在實際情況下，這將由其他系統提供，例如 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 API 搭配您自己的 CA 簽署憑證使用 TR-34 匯出金鑰。 [ExportKey](https://docs.aws.amazon.com/payment-cryptography/latest/DataAPIReference/API_ExportKey.html) 提供外部 CA 簽署的簽署憑證。

**Example 使用 BYOCA 匯出 TR-34**  

```
$ 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 SDKs，包括 Java、Python、Go 和 Rust。
+ 如果您使用自我簽署 CA 進行測試，您可以使用 OpenSSL 來建立測試 CA 並簽署 CSR。在生產環境中，使用您組織已建立的 CA 基礎設施。