About/Kubernetes

Kubernetes TLS 인증서 발급: ClusterIssuer Solver 활용하기 (HTTP01 Solver, DNS01 Solver)

김징어 2024. 12. 15. 12:01

Kubernetes TLS 인증서 발급: ClusterIssuer Solver 활용하기

Kubernetes에서 ClusterIssuer는 Let's Encrypt와 같은 인증 기관을 통해 클러스터 전역에서 사용할 수 있는 TLS 인증서를 발급하는 데 사용됩니다. 이 글에서는 ClusterIssuer의 solver를 테스트하는 방법을 다룹니다.

ClusterIssuer의 solver는 DNS01, HTTP01, 또는 기타 인증 방법을 사용하는 경우가 많습니다. 올바르게 구성되었는지 확인하려면 적절한 테스트가 필요합니다. 이 글은 일반적인 HTTP01 및 DNS01 솔버를 테스트하는 방법에 초점을 맞춥니다.


1. ClusterIssuer 개요

ClusterIssuer는 cert-manager에서 제공하는 Custom Resource로, Kubernetes 클러스터 내 모든 네임스페이스에서 사용할 수 있는 인증서를 발급하도록 구성됩니다. 일반적으로 인증서를 요청하는 Pod나 서비스가 인증서와 연결된 비밀(Secret)을 참조하여 HTTPS 통신을 수행할 수 있도록 지원합니다.


2. ClusterIssuer 설정 방법

ClusterIssuer는 먼저 올바르게 설정되어야 합니다. 예시 YAML은 다음과 같습니다:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    email: example@example.com
    server: <https://acme-v02.api.letsencrypt.org/directory>
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx

위 설정은 Let's Encrypt의 HTTP01 솔버를 사용하여 인증서를 발급합니다.


3. HTTP01 Solver 테스트 방법

HTTP01 솔버는 Ingress를 통해 ACME 서버가 HTTP 요청을 보내어 도메인 소유권을 검증합니다. 다음 절차를 따라 테스트할 수 있습니다:

3.1 테스트 인증서 요청 생성

ClusterIssuer를 테스트하려면 인증서를 요청해야 합니다. 다음은 테스트 Certificate 리소스입니다:

apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: test-cert
  namespace: default
spec:
  secretName: test-cert-tls
  dnsNames:
  - test.example.com
  issuerRef:
    name: letsencrypt-prod
    kind: ClusterIssuer

3.2 Ingress 리소스 생성 확인

HTTP01 솔버를 사용할 때 cert-manager는 자동으로 Ingress 리소스를 생성합니다. 다음 명령어로 이를 확인할 수 있습니다:

kubectl get ingress

생성된 Ingress가 적절히 구성되었는지 확인합니다. ACME 검증 URL이 올바른 경로(/test.example.com/.well-known/acme-challenge/...)로 설정되어야 합니다.

3.3 ACME 검증 테스트

다음 명령으로 인증 상태를 확인합니다:

kubectl describe certificate test-cert

Ready 상태로 변경되면 인증서 발급이 성공적으로 이루어진 것입니다.


4. DNS01 Solver 테스트 방법

DNS01 솔버는 도메인의 DNS 기록에 특정 TXT 레코드를 추가하여 도메인 소유권을 검증합니다. 다음 단계를 따라 테스트할 수 있습니다:

4.1 DNS Provider 설정

DNS01 솔버는 DNS 제공자 API를 사용합니다. 예를 들어 Cloudflare를 사용하는 경우:

apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    email: example@example.com
    server: <https://acme-v02.api.letsencrypt.org/directory>
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - dns01:
        cloudflare:
          email: example@example.com
          apiTokenSecretRef:
            name: cloudflare-api-token
            key: api-token

4.2 TXT 레코드 확인

인증 요청이 제출되면 cert-manager는 도메인의 DNS에 TXT 레코드를 추가합니다. 이를 확인하려면 다음 명령어를 사용합니다:

kubectl describe challenge

또는 DNS 툴을 사용하여 TXT 레코드를 확인할 수도 있습니다:

dig TXT _acme-challenge.test.example.com

4.3 인증 상태 확인

마찬가지로 인증 상태는 다음 명령으로 확인합니다:

kubectl describe certificate test-cert

5. 문제 해결 방법

  • Ingress가 생성되지 않는 경우:
    • ClusterIssuer 또는 Certificate 리소스의 구성을 다시 확인합니다.
    • cert-manager Pod 로그를 확인합니다:
    • kubectl logs -n cert-manager deploy/cert-manager
  • DNS 검증 실패:
    • DNS 제공자의 API 키가 올바른지 확인합니다.
    • TXT 레코드가 적절히 추가되었는지 확인합니다.

6. 공식 문서

더 자세한 정보는 cert-manager 공식 문서를 참조하세요:


ClusterIssuer와 cert-manager를 제대로 테스트하고 설정하면 Kubernetes 클러스터에서 안전하고 자동화된 인증서 관리를 쉽게 구현할 수 있습니다. 위 절차를 따라 문제를 해결하고 서비스를 보호하세요!