NitroTPM 증명 문서 검증
참고
이 주제는 서드 파티 키 관리 서비스를 사용하고 자체 증명 문서 검증 메커니즘을 빌드해야 하는 사용자를 대상으로 합니다.
이 주제에서는 전체 NitroTPM 증명 흐름에 대한 상세 개요를 제공합니다. 또한 증명 문서가 요청될 때 AWS Nitro 시스템에서 생성되는 내용을 설명하고 키 관리 서비스가 증명 문서를 처리하는 방법을 설명합니다.
증명의 목적은 인스턴스가 실행 중인 코드와 구성을 기반으로 신뢰할 수 있는 엔터티임을 증명하는 것입니다. 인스턴스에 대한 신뢰의 근간에는 증명 문서를 제공하는 AWS Nitro 시스템이 있습니다.
증명 문서는 모든 서비스에 통합할 수 있는 게시된 인증 기관을 포함하는 AWS Nitro 증명 퍼블릭 키 인프라(PKI)에 의해 서명됩니다.
증명 문서
증명 문서는 Concise Binary Object Representation(CBOR)으로 인코딩되고 CBOR 객체 서명 및 암호화(COSE)를 사용하여 서명됩니다.
CBOR에 대한 자세한 내용은 RFC 8949: Concise Binary Object Representation (CBOR)
증명 문서 사양
다음은 증명 문서의 구조를 보여줍니다.
AttestationDocument = { module_id: text, ; issuing Nitro hypervisor module ID timestamp: uint .size 8, ; UTC time when document was created, in ; milliseconds since UNIX epoch digest: digest, ; the digest function used for calculating the ; register values nitrotpm_pcrs: { + index => pcr }, ; map of PCRs at the moment the Attestation Document was generated certificate: cert, ; the public key certificate for the public key ; that was used to sign the Attestation Document cabundle: [* cert], ; issuing CA bundle for infrastructure certificate ? public_key: user_data, ; an optional DER-encoded key the attestation ; consumer can use to encrypt data with ? user_data: user_data, ; additional signed user data, defined by protocol ? nonce: user_data, ; an optional cryptographic nonce provided by the ; attestation consumer as a proof of authenticity } cert = bytes .size (1..1024) ; DER encoded certificate user_data = bytes .size (0..1024) pcr = bytes .size (32/48/64) ; PCR content index = 0..31 digest = "SHA384"
증명 문서의 선택적 파라미터(public_key, user_data, nonce)를 사용하여 증명 인스턴스와 외부 서비스 간에 사용자 지정 검증 프로토콜을 설정할 수 있습니다.
증명 문서 검증
Nitro 하이퍼바이저에서 증명 문서를 요청하는 경우 서명된 증명 문서가 포함된 바이너리 BLOB이 수신됩니다. 서명된 증명 문서는 CBOR로 인코딩되고 COSE로 서명된 객체(COSE_Sign1 서명 구조 사용)입니다. 전체 검증 프로세스에는 다음 단계가 포함됩니다.
-
CBOR 객체를 디코딩하고 COSE_Sign1 구조에 매핑하세요.
-
COSE_Sign1 구조에서 증명 문서를 추출하세요.
-
인증서의 체인을 확인하세요.
-
증명 문서에 올바르게 서명되었는지 확인하세요.
증명 문서는 상용 AWS 파티션에 대한 루트 인증서를 포함하는 AWS Nitro 증명 PKI에 의해 서명됩니다. 루트 인증서는 https://aws-nitro-enclaves.amazonaws.com/AWS_NitroEnclaves_Root-G1.zip
64:1A:03:21:A3:E2:44:EF:E4:56:46:31:95:D6:06:31:7E:D7:CD:CC:3C:17:56:E0:98:93:F3:C6:8F:79:BB:5B
루트 인증서는 AWS Certificate Manager 프라이빗 인증 기관(AWS Private CA)의 프라이빗 키에 기반하며 수명은 30년입니다. PCA의 제목 형식은 다음과 같습니다.
CN=aws.nitro-enclaves, C=US, O=Amazon, OU=AWS
COSE 및 CBOR
일반적으로 COSE_Sign1 서명 구조는 메시지에 하나의 서명만 배치되는 경우에 사용됩니다. 콘텐츠와 서명을 처리하는 파라미터는 COSE_Sign을 분리하는 대신 보호된 헤더에 배치됩니다. 구조는 사용할 컨텍스트에 따라 태그가 지정되거나 지정되지 않은 상태로 인코딩할 수 있습니다. 태그가 지정된 COSE_Sign1 구조는 CBOR 태그 18로 식별됩니다.
본문, 서명 그리고 본문 및 서명에 대한 정보를 전달하는 CBOR 객체를 COSE_Sign1 구조라고 합니다. COSE_Sign1 구조는 CBOR 배열입니다. 배열에는 다음 필드가 포함됩니다.
[ protected: Header, unprotected: Header, payload: This field contains the serialized content to be signed, signature: This field contains the computed signature value. ]
증명 문서의 컨텍스트에서 배열에는 다음이 포함됩니다.
18(/* COSE_Sign1 CBOR tag is 18 */ {1: -35}, /* This is equivalent with {algorithm: ECDS 384} */ {}, /* We have nothing in unprotected */ $ATTESTATION_DOCUMENT_CONTENT /* Attestation Document */, signature /* This is the signature */ )
CBOR에 대한 자세한 내용은 RFC 8949: Concise Binary Object Representation (CBOR)
의미 체계 유효성
증명 문서에는 항상 다음 순서로 CA 번들이 포함됩니다.
[ ROOT_CERT - INTERM_1 - INTERM_2 .... - INTERM_N] 0 1 2 N - 1
Java PKI API Programmer’s Guide
인증서를 검증하려면 증명 문서 CA 번들에서 시작하여 필요한 체인을 생성합니다. 여기서 TARGET_CERT는 증명 문서의 인증서입니다.
[TARGET_CERT, INTERM_N, ..... , INTERM_2, INTERM_1, ROOT_CERT]
인증서 유효성
체인의 모든 인증서에서 현재 날짜가 인증서에 지정된 유효 기간에 포함되는지 확인해야 합니다.
인증서 체인 유효성
일반적으로 한 CA가 서명한 퍼블릭 키 소유자의 인증서와 다른 CA가 서명한 0개 이상의 추가 CA 인증서로 구성된 여러 인증서 체인이 필요할 수 있습니다. 퍼블릭 키 사용자는 제한된 수의 보장된 CA 퍼블릭 키로만 초기화되므로 인증 경로라고 하는 이러한 체인이 필요합니다. 인터넷 PKI에 대한 인증 경로 검증 절차는 X.509에 제공된 알고리즘에 기반합니다. 인증 경로 처리 시 주체 고유 이름 및/또는 주체 대체 이름과 주체 퍼블릭 키 간의 바인딩을 확인합니다. 바인딩은 신뢰 당사자가 지정한 경로 및 입력을 구성하는 인증서에 지정된 제약 조건에 의해 제한됩니다. 기본 제약 조건 및 정책 제약 조건 확장을 통해 인증 경로 처리 로직이 의사 결정 프로세스를 자동화할 수 있습니다.
참고
검증을 수행할 때 CRL을 비활성화해야 합니다.
Java를 사용하면 루트 경로 및 생성된 인증서 체인부터 시작하여 다음과 같이 체인 검증이 수행됩니다.
validateCertsPath(certChain, rootCertficate) { /* The trust anchor is the root CA to trust */ trustAnchors.add(rootCertificate); /* We need PKIX parameters to specify the trust anchors * and disable the CRL validation */ validationParameters = new PKIXParameters(trustAnchors); certPathValidator = CertPathValidator.getInstance(PKIX); validationParameters.setRevocationEnabled(false); /* We are ensuring that certificates are chained correctly */ certPathValidator.validate(certPath, validationParameters); }