8.4. ACME 발행자를 사용하여 인증서 관리

cert-manager Operator for Red Hat OpenShift는 Let's Encrypt와 같은 ACME CA 서버 사용을 지원하여 인증서를 발행할 수 있습니다.

8.4.1. ACME 발행자 정보

Red Hat OpenShift용 cert-manager Operator의 ACME 발행자 유형은 ACME(Automated Certificate Management Environment) 인증 기관(CA) 서버를 나타냅니다. ACME CA 서버는 클라이언트 인증서가 요청되는 도메인 이름을 소유하고 있는지 확인하는 데 의존합니다. 문제가 성공하면 Red Hat OpenShift용 cert-manager Operator에서 인증서를 발행할 수 있습니다. 문제가 실패하면 Red Hat OpenShift용 cert-manager Operator에서 인증서를 발행하지 않습니다.

8.4.1.1. 지원되는 ACME 챌린지 유형

Red Hat OpenShift용 cert-manager Operator는 ACME 발급자에 대해 다음과 같은 챌린지 유형을 지원합니다.

HTTP-01

HTTP-01 챌린지 유형을 사용하면 도메인의 HTTP URL 끝점에서 계산 키를 제공합니다. ACME CA 서버가 URL에서 키를 가져올 수 있는 경우 도메인의 소유자로 유효성을 검증할 수 있습니다.

자세한 내용은 업스트림 cert-manager 설명서의 HTTP01 을 참조하십시오.

DNS-01

DNS-01 챌린지 유형을 사용하면 DNS TXT 레코드에서 계산 키를 제공합니다. ACME CA 서버에서 DNS 조회로 키를 가져올 수 있는 경우 도메인의 소유자로 유효성을 검증할 수 있습니다.

자세한 내용은 업스트림 cert-manager 설명서의 DNS01 을 참조하십시오.

8.4.1.2. 지원되는 DNS-01 공급자

Red Hat OpenShift용 cert-manager Operator는 ACME 발급자를 위한 다음 DNS-01 공급자를 지원합니다.

  • Amazon Route 53
  • Azure DNS

    참고

    Red Hat OpenShift용 cert-manager Operator는 Azure AD(Azure Active Directory) Pod ID를 사용하여 Pod에 관리형 ID를 할당하는 것을 지원하지 않습니다.

  • Google Cloud DNS

    참고

    Red Hat OpenShift용 cert-manager Operator는 Google 워크로드 ID 페더레이션 사용을 지원하지 않습니다.

8.4.2. HTTP-01 문제를 해결하기 위해 ACME 발행자 구성

cert-manager Operator for Red Hat OpenShift를 사용하여 HTTP-01 문제를 해결하기 위해 ACME 발행자를 설정할 수 있습니다. 이 절차에서는 Let's Encrypt를 ACME CA 서버로 사용합니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 클러스터에 액세스할 수 있어야 합니다.
  • 노출하려는 서비스가 있습니다. 이 절차에서 서비스의 이름은 sample-workload 입니다.

절차

  1. ACME 클러스터 발행자를 생성합니다.

    1. ClusterIssuer 오브젝트를 정의하는 YAML 파일을 생성합니다.

      acme-cluster-issuer.yaml 파일 예

      apiVersion: cert-manager.io/v1
      kind: ClusterIssuer
      metadata:
        name: letsencrypt-staging                                        1
      spec:
        acme:
          preferredChain: ""
          privateKeySecretRef:
            name: <secret_for_private_key>                               2
          server: https://acme-staging-v02.api.letsencrypt.org/directory 3
          solvers:
          - http01:
              ingress:
                class: openshift-default                                 4

      1
      클러스터 발행자의 이름을 지정합니다.
      2
      & lt;secret_private_key >를 ACME 계정 개인 키를 저장할 secret 이름으로 교체합니다.
      3
      ACME 서버의 디렉터리 끝점에 액세스할 URL을 지정합니다. 이 예에서는 Let's Encrypt staging 환경을 사용합니다.
      4
      Ingress 클래스를 지정합니다.
    2. 다음 명령을 실행하여 ClusterIssuer 오브젝트를 생성합니다.

      $ oc create -f acme-cluster-issuer.yaml
  2. 사용자 워크로드의 서비스를 노출하는 Ingress를 생성합니다.

    1. Namespace 오브젝트를 정의하는 YAML 파일을 생성합니다.

      namespace.yaml 파일 예

      apiVersion: v1
      kind: Namespace
      metadata:
        name: my-ingress-namespace 1

      1
      Ingress의 네임스페이스를 지정합니다.
    2. 다음 명령을 실행하여 Namespace 오브젝트를 생성합니다.

      $ oc create -f namespace.yaml
    3. Ingress 오브젝트를 정의하는 YAML 파일을 생성합니다.

      ingress.yaml 파일 예

      apiVersion: networking.k8s.io/v1
      kind: Ingress
      metadata:
        name: sample-ingress                                           1
        namespace: my-ingress-namespace                                2
        annotations:
          cert-manager.io/cluster-issuer: letsencrypt-staging          3
          acme.cert-manager.io/http01-ingress-class: openshift-default 4
      spec:
        ingressClassName: openshift-default                            5
        tls:
        - hosts:
          - <hostname>                                                 6
          secretName: sample-tls                                       7
        rules:
        - host: <hostname>                                             8
          http:
            paths:
            - path: /
              pathType: Prefix
              backend:
                service:
                  name: sample-workload                                9
                  port:
                    number: 80

      1
      Ingress 이름을 지정합니다.
      2
      Ingress용으로 생성한 네임스페이스를 지정합니다.
      3
      생성한 클러스터 발행자를 지정합니다.
      4
      Ingress 클래스를 지정합니다.
      5
      Ingress 클래스를 지정합니다.
      6
      & lt;hostname >을 인증서와 연결할 주체 대체 이름으로 바꿉니다. 이 이름은 인증서에 DNS 이름을 추가하는 데 사용됩니다.
      7
      생성된 인증서를 저장할 보안을 지정합니다.
      8
      &lt ;hostname&gt;을 호스트 이름으로 교체합니다. < host_name>.<cluster_ingress_domain > 구문을 사용하여 *.<cluster_ingress_domain > 와일드카드 DNS 레코드를 활용하고 클러스터에 대한 인증서를 제공할 수 있습니다. 예를 들어 apps.<cluster_base_domain>을 사용할 수 있습니다. 그렇지 않으면 선택한 호스트 이름에 대한 DNS 레코드가 있는지 확인해야 합니다.
      9
      노출할 서비스 이름을 지정합니다. 이 예에서는 sample-workload 라는 서비스를 사용합니다.
    4. 다음 명령을 실행하여 Ingress 오브젝트를 생성합니다.

      $ oc create -f ingress.yaml

8.4.3. DNS-01 문제를 해결하기 위해 ACME 발행자 구성

cert-manager Operator for Red Hat OpenShift를 사용하여 ACME 발행자를 설정하여 DNS-01 문제를 해결할 수 있습니다. 이 절차에서는 Let's Encrypt 를 ACME CA 서버로 사용하고 Amazon Route 53을 사용하여 DNS-01 문제를 해결하는 방법을 보여줍니다.

참고

프라이빗 DNS 영역은 지원되지 않습니다.

사전 요구 사항

  • cluster-admin 역할의 사용자로 OpenShift Container Platform 클러스터에 액세스할 수 있습니다.
  • Amazon Route 53에 대한 IAM 역할을 설정했습니다. 자세한 내용은 업스트림 cert-manager 설명서의 Route53 을 참조하십시오.

    참고

    클러스터가 AWS STS(Security Token Service)를 사용하도록 구성되지 않은 경우 명시적 accessKeyIDsecretAccessKey 인증 정보를 제공해야 합니다. 클러스터가 AWS STS를 사용하는 경우 암시적 앰비언트 인증 정보를 사용할 수 있습니다.

절차

  1. 선택 사항: DNS-01 자체 검사의 네임서버 설정을 재정의합니다.

    이 단계는 대상 퍼블릭 호스팅 영역이 클러스터의 기본 프라이빗 호스팅 영역과 겹치는 경우에만 필요합니다.

    1. 다음 명령을 실행하여 CertManager 리소스를 편집합니다.

      $ oc edit certmanager cluster
    2. 다음 덮어쓰기 인수를 사용하여 spec.controllerConfig 섹션을 추가합니다.

      apiVersion: operator.openshift.io/v1alpha1
      kind: CertManager
      metadata:
        name: cluster
        ...
      spec:
        ...
        controllerConfig:                                1
          overrideArgs:
            - '--dns01-recursive-nameservers=1.1.1.1:53' 2
            - '--dns01-recursive-nameservers-only'       3
      1
      spec.controllerConfig 섹션을 추가합니다.
      2
      DNS-01 자체 검사를 쿼리할 쉼표로 구분된 < host>:<port > 이름 서버 목록을 제공합니다.
      3
      해당 도메인과 연결된 권한 있는 네임서버를 확인하는 대신 재귀 이름 서버만 사용하도록 지정합니다.
    3. 파일을 저장하여 변경 사항을 적용합니다.
  2. 선택 사항: 발급자에 대한 네임스페이스를 생성합니다.

    1. Namespace 오브젝트를 정의하는 YAML 파일을 생성합니다.

      namespace.yaml 파일 예

      apiVersion: v1
      kind: Namespace
      metadata:
        name: my-issuer-namespace 1

      1
      발행자의 네임스페이스를 지정합니다.
    2. 다음 명령을 실행하여 Namespace 오브젝트를 생성합니다.

      $ oc create -f namespace.yaml
  3. 다음 명령을 실행하여 AWS 인증 정보를 저장할 시크릿을 생성합니다.

    $ oc create secret generic aws-secret --from-literal=awsSecretAccessKey=<aws_secret_access_key> \ 1
        -n my-issuer-namespace
    1
    & lt;aws_secret_access_key&gt;를 AWS 시크릿 액세스 키로 교체합니다.
  4. 발급자를 만듭니다.

    1. Issuer 오브젝트를 정의하는 YAML 파일을 생성합니다.

      issuer.yaml 파일 예

      apiVersion: cert-manager.io/v1
      kind: Issuer
      metadata:
        name: letsencrypt-staging                                        1
        namespace: my-issuer-namespace                                   2
      spec:
        acme:
          server: https://acme-staging-v02.api.letsencrypt.org/directory 3
          email: "<email_address>"                                       4
          privateKeySecretRef:
            name: <secret_private_key>                                   5
          solvers:
          - dns01:
              route53:
                accessKeyID: <aws_key_id>                                6
                hostedZoneID: <hosted_zone_id>                           7
                region: us-east-1
                secretAccessKeySecretRef:
                  name: "aws-secret"                                     8
                  key: "awsSecretAccessKey"                              9

      1
      발행자의 이름을 지정합니다.
      2
      발행자를 위해 생성한 네임스페이스를 지정합니다.
      3
      ACME 서버의 디렉터리 끝점에 액세스할 URL을 지정합니다. 이 예에서는 Let's Encrypt staging 환경을 사용합니다.
      4
      &lt ;email_address&gt;를 이메일 주소로 바꿉니다.
      5
      & lt;secret_private_key >를 ACME 계정 개인 키를 저장할 시크릿 이름으로 교체합니다.
      6
      &lt ;aws_key_id&gt;를 AWS 키 ID로 바꿉니다.
      7
      &lt ;hosted_zone_id&gt;를 호스팅 영역 ID로 바꿉니다.
      8
      생성한 보안의 이름을 지정합니다.
      9
      AWS 시크릿 액세스 키를 저장하는 시크릿의 키를 지정합니다.
    2. 다음 명령을 실행하여 Issuer 오브젝트를 생성합니다.

      $ oc create -f issuer.yaml
  5. 인증서를 생성합니다.

    1. Certificate 오브젝트를 정의하는 YAML 파일을 생성합니다.

      certificate.yaml 파일 예

      apiVersion: cert-manager.io/v1
      kind: Certificate
      metadata:
        name: my-tls-cert              1
        namespace: my-issuer-namespace 2
      spec:
        isCA: false
        commonName: '<common_name>'    3
        secretName: my-tls-cert        4
        dnsNames:
        - '<domain_name>'              5
        issuerRef:
          name: letsencrypt-staging    6
          kind: Issuer

      1
      인증서 이름을 입력합니다.
      2
      발행자를 위해 생성한 네임스페이스를 지정합니다.
      3
      &lt ;common_name&gt;을 CN(일반 이름)으로 바꿉니다.
      4
      인증서를 포함할 보안의 이름을 지정합니다.
      5
      &lt ;domain_name&gt;을 도메인 이름으로 바꿉니다.
      6
      생성한 발급자의 이름을 지정합니다.
    2. 다음 명령을 실행하여 Certificate 오브젝트를 생성합니다.

      $ oc create -f certificate.yaml