

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# BYOCA(Bring Your Own Certificate Authority)
<a name="keyexchange-byoca"></a>

기본적으로 서비스 내에서 생성된 비대칭(RSA,ECC) 키에 퍼블릭 키 인증서가 필요한 경우 이러한 인증서는 AWS Payment Cryptography 및 계정 고유 인증 기관(CA)에서 발급합니다. 이렇게 하면 CA를 식별 또는 설정하거나 인증서 서명 요청(CSR)을 관리할 필요 없이 X.509를 간단하게 사용할 수 있습니다.

AWS Payment Cryptography는 정책 또는 규정 준수 이유로 필요한 경우 자체 CA를 사용할 수 있는 기능도 제공합니다.

## 개요
<a name="keyexchange-byoca.overview"></a>

BYOCA 기능을 사용하면 TR-34 가져오기/내보내기, RSA 언래핑, ECDH 기반 키 전송 등 인증서가 사용되는 모든 곳에서 자체 인증 기관을 사용할 수 있습니다. 이는 조직 전체에서 일관된 인증서 체인을 유지해야 하거나 특정 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)는 외부 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 Private CA 또는 조직의 설정된 CA 인프라를 사용합니다. 테스트 목적으로 OpenSSL을 사용하여 자체 서명된 인증서를 생성할 수 있습니다.

#### 사용 AWS Private CA
<a name="keyexchange-byoca.sign-csr-pca"></a>

를 사용하여 CSR에 서명하려면 AWS Private CA먼저 base64로 인코딩된 CSR을 디코딩하고 파일에 저장한 다음 [IssueCertificate](https://docs.aws.amazon.com/acm-pca/latest/APIReference/API_IssueCertificate.html) API를 사용합니다.

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

내보내기 단계에서 사용할 인증서 콘텐츠를 저장합니다. `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"
    }
}
```

내보내기 단계에서 `KeyArn` 사용할 CA를 기록해 둡니다.

### 6단계: KRD 암호화 인증서 가져오기
<a name="keyexchange-byoca.get-krd"></a>

이 예제에서는 AWS Payment Cryptography로 다시 가져오므로 [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를 사용하여 표시됩니다. Java, Python, Go 및 Rust를 포함한 모든 AWS SDKs에서 동일한 기능을 사용할 수 있습니다.
+ 자체 서명된 CA로 테스트하는 경우 OpenSSL을 사용하여 테스트 CA를 생성하고 CSR에 서명할 수 있습니다. 프로덕션 환경에서는 조직의 설정된 CA 인프라를 사용합니다.