Skip to main content

Let's Encrypt with cert-manager


Let's Encrypt

HTTP-01 challenge

인증을 시작하면 <path><token>을 발행해 주는데, http://<domain>/.well-known/acme-challenge/<path>에 접속했을 때 <token>을 반환하도록 하여 서버를 제어할 수 있음을 증명하면 인증서가 발급됩니다. 80 포트만 사용 가능하며 와일드카드("*".<domain>)를 사용할 수 없습니다.

DNS-01 challenge

인증을 시작하면 <token>을 발행해 주는데, _acme-challenge.<domain> TXT 레코드에 넣어 DNS를 제어할 수 있음을 증명하면 인증서가 발급됩니다. DNS 제공 업체에서 자동으로 DNS를 업데이트 할 수 있도록 API를 제공해주는 경우 좋습니다. 오래된 TXT 레코드는 삭제해주는 것이 좋습니다.

Cloudflare

API tokenAPI key를 사용한 방법이 있는데, 여기서는 API token만 테스트 해보겠습니다.

My Profile -> API Tokens -> Create Token 에서 Edit zone DNS 템플릿 을 사용하여 토큰을 생성합니다. 예시로 아래와 같이 설정했습니다.

  • Permissions
    • Zone, DNS, Edit
    • Zone, Zone, Read
  • Zone
    • Include, Specific zone, <domain>
  • Client IP Address Filtering
    • None
  • TTL
    • None

생성하면 토큰과 함께 테스트 코드를 줍니다.

kubectl create secret \
generic \
-n auth \
cloudflare-api-token \
--from-literal=token=<token>
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt
spec:
acme:
email: "" # email
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
name: letsencrypt
solvers:
- selector:
dnsZones:
- "" # "domain"
dns01:
cloudflare:
email: "" # cloudflare email
apiTokenSecretRef:
name: cloudflare-api-token
key: token
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: ingress-cert
namespace: istio-system # 이를 사용할 ingress gateway의 namespace를 지정합니다.
spec:
secretName: ingress-cert-tls
duration: 2160h # 90d
renewBefore: 360h # 15d
dnsNames:
- "" # "*.sub.domain"
- "" # "sub.domain"
issuerRef:
kind: ClusterIssuer
name: letsencrypt

Certificate을 생성하는 순간 인증을 시작합니다.

kubectl describe clusterissuers.cert-manager.io letsencrypt
kubectl get certificates.cert-manager.io -n istio-system ingress-cert
warning

이 다음 순서는 인증에 실패를 하는 경우 체크 해볼 수 있는 절차입니다. 무조건 실행해보기 보단 Status, Events를 잘 읽어보면서 적절한 명령어를 실행시켜서 디버깅 해야합니다.

kubectl describe certificates.cert-manager.io -n istio-system ingress-cert
kubectl describe certificaterequests.cert-manager.io -n istio-ingress <name>
kubectl logs cert-manager-