PKI 플러그인과 함께 ACME 프로토콜 사용하기

PKI 플러그인과 함께 ACME 프로토콜 사용하기

Automatic Certificate Management Environment(ACME) 프로토콜은 IETF 표준 프로토콜(RFC 8555)로, 클라이언트가 도메인 이름에 대한 통제권을 증명하고 ACME 인증 기관(CA)에서 리프 인증서를 요청하는 방식을 자동화하게 해요. 이 프로토콜은 여러 도전 과제 유형을 정의하지만 가장 일반적으로 사용되는 유형은 HTTP-01, DNS-01, TLS-ALPN-01이에요.

ACME 클라이언트는 도전 과제 유형에 따라 인증서를 원하는 도메인에 특정 리소스를 프로비저닝해요. 예를 들어 클라이언트는 HTTP-01용 특정 HTTP 엔드포인트나 DNS-01용 특정 DNS 레코드를 프로비저닝해요. 클라이언트가 도메인에 대한 통제권을 성공적으로 증명하면 ACME CA에서 인증서 발급을 요청할 수 있어요.

출처: 문서

본문

Vault PKI ACME 디렉터리(Vault PKI ACME directories)

Vault PKI는 여러 ACME 디렉터리를 지원해요. 각 디렉터리는 구성 기본값, 발급자(issuer), 역할에 대해 서로 다른 제한이 있어요. 기본적으로 PKI 플러그인은 ACME 디렉터리에 default_directory_policy 값을 사용해요.

다음 표는 현재 지원되는 디렉터리의 기본 발급자, 역할, 디렉터리 URL 값을 제공해요.

경로 기본 디렉터리 정책 발급자 역할
/pki/acme/directory sign-verbatim default Sign-Verbatim
/pki/issuer/:issuer_ref/acme/directory :issuer_ref
/pki/roles/:role/acme/directory role:role_ref (any) :role
/pki/issuer/:issuer_ref/roles/:role/acme/directory role:role_ref :issuer_ref :role
/pki/external-policy(/:policy)/acme/directory external-policy(:policy) Specified by CIEPS
/pki/issuer/:issuer_ref/external-policy(/:policy)/acme/directory external-policy(:policy) :issuer_ref Specified by CIEPS

명시적 역할을 설정하지 않으면 Vault는 ACME 구성의 default_directory_policy 값을 사용해 적절한 동작을 결정해요.

  • forbid — 디렉터리를 금지시켜요.
  • sign-verbatim — 요청된 인증서 식별자에 대해 ACME 프로토콜에 내장된 추가 소유자 검증과 함께 Sign Verbatim을 호출하는 것과 유사해요. 클라이언트는 소유권을 증명할 수 있는 어떤 식별자에 대해서도 인증서를 받아요.
  • role:role_ref — ACME 도전 과제 검증을 적용하고 지정된 역할로 인증서를 제한해요. 클라이언트는 요청된 식별자의 소유권을 증명할 수 있고 식별자가 역할에서 허용되면 인증서를 받아요.
  • external-policy — ACME 도전 과제 검증을 적용하지만 역할 대신 Certificate Issuance External Policy Service(CIEPS)를 사용해 인증서를 검증하고 템플릿화해요. external-policy:policy로 명시적 정책 이름을 지정할 수 있어요. (Enterprise 기능 — 적절한 Vault Enterprise 라이선스 또는 HCP Vault Dedicated 클러스터가 필요해요.)

ACME 외부 계정 바인딩(ACME external account bindings)

ACME External Account Binding(EAB) 정책을 사용해 클라이언트가 Vault에 유효한 외부 계정 바인딩을 가져야 하도록 강제할 수 있어요. 새 계정을 등록하기 전에 인증된 Vault 클라이언트가 새 EAB 토큰을 가져와요. 이것은 두 값을 반환해요: 키 식별자와 ACME 클라이언트가 EAB로 인증하는 데 사용하는 HMAC 키.

예를 들어:

Vault에서 EAB 토큰을 만들어요.

$ vault write -f /pki/acme/new-eab

키 ID와 HMAC을 사용해 ACME 디렉터리를 호출해요. 예를 들어 Certbot과 함께 EAB 정책을 사용하려면:

$ certbot certonly \
    --server https://localhost:8200/v1/pki/acme/directory \
    --eab-kid <id> \
    --eab-hmac-key <hmac-key>

EAB가 있든 없든 ACME 클라이언트의 요청은 전통적인 Vault 인증을 사용하지 않아요. 대신 요청이 ACME 프로토콜을 통해 인증돼요. EAB를 쓰면 Vault 인증 클라이언트가 먼저 EAB 토큰을 가져와 초기 등록에 사용하기 위해 ACME 클라이언트에 전달해요. EAB 토큰은 ACME 클라이언트 등록을 클라이언트 엔티티나 다른 정보에 바인딩하지 않고 인증된 Vault 엔드포인트에 바인딩해요.

공개 노출 Vault 배포에는 EAB 요구(Require EAB for public-facing Vault deployments) — 공개 노출 Vault 배포에 대해 EAB 활성화를 적극 권장해요. VAULT_DISABLE_PUBLIC_ACME 환경 변수를 사용해 모든 ACME 인스턴스에 EAB를 강제로 활성화하세요.

Vault PKI 마운트에서 ACME 지원 활성화하기(Enable ACME support on a Vault PKI mount)

1단계: PKI 마운트의 튜닝 가능 파라미터 업데이트(Update tunable parameters on your PKI mount) — PKI 마운트 구성에서 allowed_response_headers 설정을 튜닝해 ACME 클라이언트가 PKI ACME 서버의 응답에서 기대하는 다음 응답 헤더를 제공해야 해요: Link, Location, Replay-Nonce.

예를 들어 pki/에 마운트된 PKI 플러그인의 allowed-response-headers를 튜닝하려면:

$ vault secrets tune \
    -allowed-response-headers=Link \
    -allowed-response-headers=Location \
    -allowed-response-headers=Replay-Nonce \
    pki

2단계: PKI ACME 구성 업데이트(Update your PKI ACME configuration) — PKI 마운트의 클러스터 경로(cluster path) 구성을 업데이트해요. 클러스터 경로는 ACME 디렉터리에서 클라이언트에 ACME 기본 URL을 제공해요.

$ vault write pki/config/cluster path=https://cluster-b.vault.example.com/v1/pki

ACME 구성을 업데이트해 최상위 ACME 디렉터리의 기본 동작을 설정하고, ACME를 특정 발급자와 역할로 제한하며, 해당되는 경우 EAB 정책을 정의해요. 예를 들어 제한적인 EAB 정책과 허용된 역할을 함께 지정하려면:

$ vault write pki/config/acme \
    enabled=true \
    default_directory_policy="role:role-acme-a" \
    eab_policy="always-required" \
    allowed_roles="role-acme-a,role-acme-b"

추가 리소스(Additional resources)

  • Enable ACME with PKI secrets engine 튜토리얼은 PKI 시크릿 엔진 마운트에서 ACME 지원을 활성화하고 Caddy ACME 클라이언트와 사용하는 과정을 안내해요.
  • ACME troubleshooting guide는 ACME 발급과 Vault PKI의 실패를 해결하기 위한 조언 목록을 제공해요.
  • PKI 시크릿 엔진 API 참조는 PKI 플러그인과 상호작용하는 추가 세부 정보를 제공해요.

더 알아보기 (Learn more)

  • PKI 시크릿 엔진 개요와 발급 프로토콜(EST, CMPv2, SCEP) 문서를 확인해 보세요.
  • Enable ACME with PKI secrets engine 튜토리얼을 확인해 보세요.