

# 고급 해지 시나리오
<a name="advanced-revocation-scenarios"></a>

더 복잡한 인증서 해지 요구 사항을 보려면 다음과 같은 추가 구성을 고려하세요.

**Topics**
+ [인증서 해지 목록(CRL)을 KeyValueStore 형식으로 변환](#convert-crl-kvs-format)
+ [여러 인증 기관 처리](#handle-multiple-cas)
+ [연결 로그에 사용자 지정 데이터 추가](#add-custom-data-logs)
+ [CRL 업데이트 관리](#manage-crl-updates)
+ [KeyValueStore 용량 계획](#plan-kvs-capacity)

## 인증서 해지 목록(CRL)을 KeyValueStore 형식으로 변환
<a name="convert-crl-kvs-format"></a>

인증서 해지 목록(CRL) 파일이 있는 경우 OpenSSL 및 jq를 사용하여 KeyValueStore JSON 형식으로 변환할 수 있습니다.

**CRL을 KeyValueStore 형식으로 변환**

다음과 같이 CRL 파일에서 일련 번호를 추출합니다.

```
openssl crl -text -noout -in rfc5280_CRL.crl | \
  awk '/Serial Number:/ {print $3}' | \
  cut -d'=' -f2 | \
  sed 's/../&:/g;s/:$//' >> serialnumbers.txt
```

일련 번호를 KeyValueStore JSON 형식으로 변환합니다.

```
jq -R -s 'split("\n") | map(select(length > 0)) | {data: map({"key": ., "value": ""})}' \
  serialnumbers.txt >> serialnumbers_kvs.json
```

형식이 지정된 파일을 S3에 업로드하고 1단계에 설명된 대로 KeyValueStore를 생성합니다.

## 여러 인증 기관 처리
<a name="handle-multiple-cas"></a>

TrustStore에 여러 인증 기관(CA)이 포함된 경우 KeyValueStore 키에 발급자 정보를 포함하여 일련 번호가 같을 수 있는 다른 CA의 인증서 간 충돌을 방지합니다.

다중 CA 시나리오의 경우 발급자의 SHA1 해시와 일련 번호를 키로 조합하여 사용합니다.

```
import cf from 'cloudfront';

async function connectionHandler(connection) {
    const kvsHandle = cf.kvs();
    const clientCert = connection.clientCertInfo;
    
    // Create composite key with issuer hash and serial number
    const issuer = clientCert.issuer.replace(/[^a-zA-Z0-9]/g, '').substring(0, 20);
    const serialno = clientCert.serialNumber;
    const compositeKey = `${issuer}_${serialno}`;
    
    const cert_revoked = await kvsHandle.exists(compositeKey);
    
    if (cert_revoked) {
        console.log(`Blocking revoked cert: ${serialno} from issuer: ${issuer}`);
        connection.deny();
    } else {
        connection.allow();
    }
}
```

**참고**  
발급자 식별자 \$1 일련 번호를 사용하면 키가 더 길어져 KeyValueStore에 저장할 수 있는 총 항목 수가 줄어들 수 있습니다.

## 연결 로그에 사용자 지정 데이터 추가
<a name="add-custom-data-logs"></a>

연결 함수는 logCustomData 메서드를 사용하여 CloudFront 연결 로그에 사용자 지정 데이터를 추가할 수 있습니다. 이렇게 하면 해지 확인 결과, 인증서 정보 또는 기타 관련 데이터를 로그에 포함할 수 있습니다.

```
async function connectionHandler(connection) {
    const kvsHandle = cf.kvs();
    const clientSerialNumber = connection.clientCertInfo.serialNumber;
    const serialNumberExistsInKvs = await kvsHandle.exists(clientSerialNumber);
    
    if (serialNumberExistsInKvs) {
        // Log revocation details to connection logs
        connection.logCustomData(`REVOKED:${clientSerialNumber}:DENIED`);
        console.log("Connection denied - certificate revoked");
        return connection.deny();
    }
    
    // Log successful validation
    connection.logCustomData(`VALID:${clientSerialNumber}:ALLOWED`);
    console.log("Connection allowed");
    return connection.allow();
}
```

사용자 지정 데이터는 800바이트의 유효한 UTF-8 텍스트로 제한됩니다. 이 제한을 초과하면 CloudFront는 데이터를 가장 가까운 유효한 UTF-8 경계로 잘라냅니다.

**참고**  
사용자 지정 데이터 로깅은 배포에 연결 로그가 활성화된 경우에만 작동합니다. 연결 로그가 구성되지 않은 경우 logCustomData 메서드는 no-op입니다.

## CRL 업데이트 관리
<a name="manage-crl-updates"></a>

인증 기관은 두 가지 유형의 CRL을 발급할 수 있습니다.
+ **전체 CRL**: 해지된 모든 인증서의 전체 목록 포함
+ **델타 CRL**: 마지막 전체 CRL 이후 해지된 인증서만 나열

전체 CRL 업데이트의 경우 업데이트된 데이터로 새 KeyValueStore를 생성하고 연결 함수 연결을 새 KeyValueStore로 리디렉션합니다. 이 접근 방식은 차이를 계산하고 증분 업데이트를 수행하는 것보다 더 간단합니다.

델타 CRL 업데이트의 경우 update-keys 명령을 사용하여 해지된 새 인증서를 기존 KeyValueStore에 추가합니다.

```
aws cloudfront update-key-value-store \
  --name "revoked-serials-kvs" \
  --if-match "current-etag" \
  --put file://delta-revoked-serials.json
```

## KeyValueStore 용량 계획
<a name="plan-kvs-capacity"></a>

KeyValueStore는 크기 제한이 5MB이며 최대 1천만 개의 키-값 페어를 지원합니다. 키 형식 및 데이터 크기에 따라 취소 목록 용량을 계획합니다.
+ **일련 번호만 해당**: 간단한 해지 확인을 위한 효율적인 스토리지
+ **발급자 식별자 \$1 일련 번호**: 다중 CA 환경을 위한 더 긴 키

대규모 해지 목록의 경우 다양한 인증서 범주 또는 기간에 대해 별도의 KeyValueStores를 유지하는 계층형 접근 방식을 구현하는 것이 좋습니다.