SSL로 커스텀 도메인 보안 적용

App Engine 앱의 SSL 지원은 전 세계 사용자에게 앱을 빠르고 안전하며 안정적으로 제공하도록 전 세계에 분산된 SSL 엔드포인트와 기본 제공 부하 분산 기능을 제공하는 등 기본 SSL을 넘어서는 기능을 제공합니다.

기본적으로 커스텀 도메인의 HTTPS 연결은 관리형 SSL 인증서를 사용하여 자동으로 사용 설정됩니다. 커스텀 도메인이 애플리케이션에 매핑되고 DNS 레코드가 구성되면 App Engine이 관리형 SSL 인증서를 프로비저닝하고, 인증서가 만료되기 전에 인증서 갱신을 처리하고, 애플리케이션에서 커스텀 도메인이 삭제되면 인증서를 취소합니다.

시작하기 전에

관리형 인증서 프로비저닝 확인

커스텀 도메인을 설정하고 DNS 레코드를 업데이트한 후 몇 분 안에 자동으로 관리형 SSL 인증서가 제공됩니다. 관리형 인증서는 Let's Encrypt에 의해 서명됩니다.

인증서가 프로비저닝되었는지 확인하려면 다음 단계를 따르세요.

Console
  1. Google Cloud Platform Console에서 App Engine > 설정 > 커스텀 도메인으로 이동합니다.

    커스텀 도메인 페이지로 이동

  2. SSL 보안Google 관리로 표시되어야 합니다.

    Google에서 관리하는 SSL 보안

gcloud
  1. 다음 gcloud app domain-mappings 명령어를 실행하여 인증서가 App Engine 앱에 프로비저닝되었는지 확인합니다.

    gcloud app domain-mappings list
  2. 도메인, 하위 도메인, 해당하는 모든 인증서의 목록이 표시됩니다. 예를 들면 다음과 같습니다.

    ID               SSL_CERTIFICATE_ID
    example.com      123456
    www.example.com  234567
    인증서가 프로비저닝되는 데 몇 분 정도 걸릴 수 있습니다. 그동안 인증서는 PENDING_AUTO_CERT로 표시됩니다.

관리형 SSL 인증서 문제해결

  • 도메인 이름을 확인하려면 커스텀 도메인의 DNS 레코드를 업데이트해야 할 수 있습니다. App Engine은 확인되지 않은 도메인에 인증서를 프로비저닝할 수 없습니다.

  • AuthorizedCertificate.GET 요청을 사용하여 Admin API로 인증서 상태를 확인할 수 있습니다.

  • DNS 레코드를 사용할 수 없어 관리형 인증서가 프로비저닝되지 않은 경우 ManagedCertificate.ManagementStatus 필드가 FAILED_RETRYING_NOT_VISIBLE로 설정될 수 있습니다. DNS 레코드가 최신 상태인지 확인하고 몇 분 정도 기다린 뒤 다시 시도합니다. 최대 24시간이 지나야 DNS 레코드를 사용할 수 있습니다.

  • 상태가 FAILED_PERMANENT이면 모든 갱신 시도가 실패한 것입니다. DNS 설정을 확인한 후 관리형 SSL 인증서로 업데이트하기 위한 단계를 따라 커스텀 도메인 매핑을 업데이트합니다.

관리형 SSL 인증서로 업그레이드

Google에서 관리하는 SSL 인증서로 업그레이드하기 전에 관리형 인증서는 와일드 카드 매핑을 지원하지 않습니다.

하위 도메인을 사용하는 경우 기본 도메인마다 관리형 인증서가 매주 20개로 제한됩니다. 한도에 도달해도 App Engine은 모든 요청이 처리될 때까지 관리형 인증서 발급을 계속 시도합니다.

자체 SSL 인증서 대신 Google에서 관리하는 SSL 인증서를 사용하거나 커스텀 도메인의 기존 앱에 관리형 SSL 인증서를 추가하려면 다음과 같이 도메인 매핑을 업데이트합니다.

Console
  1. Google Cloud Platform Console에서 App Engine > 설정 > 커스텀 도메인으로 이동합니다.

    커스텀 도메인 페이지로 이동

  2. 보호할 도메인을 선택하고 SSL 보안 사용 설정을 클릭합니다.

    커스텀 도메인 페이지에서 SSL 보안 사용 설정하기

gcloud

다음 gcloud app domain-mappings 명령어를 실행하여 애플리케이션에 도메인 매핑을 업데이트합니다.

gcloud app domain-mappings update DOMAIN --certificate-management='AUTOMATIC'
API

도메인 매핑을 프로그래매틱 방식으로 업데이트하여 관리형 SSL 인증서로 이전하려면 Admin API의 apps.domainMappings.patch 메서드를 참조하세요.

관리형 SSL 인증서 중지

관리형 SSL 인증서를 중지하려면 다음 단계를 따르세요.

Console
  1. Google Cloud Platform Console에서 App Engine > 설정 > 커스텀 도메인으로 이동합니다.

    커스텀 도메인 페이지로 이동

  2. 도메인을 선택하고 SSL 보안 중지를 클릭합니다.

    커스텀 도메인 페이지에서 SSL 보안 사용 중지하기

gcloud

도메인 매핑에 이미 연결되어 있는 관리형 SSL 인증서를 중지할 수 있습니다. 또는 커스텀 도메인을 처음 매핑할 때 관리형 SSL 인증서를 사용하지 않을 수 있습니다.

  • 기존 매핑에서 인증서를 삭제하려면 다음 gcloud app domain-mappings 명령어를 실행합니다.

    gcloud app domain-mappings update DOMAIN --certificate-management='MANUAL'
    
  • 애플리케이션에 새 커스텀 도메인을 처음 매핑할 때 관리형 SSL 인증서를 사용하지 않도록 지정하려면 다음 명령어를 실행합니다.

    gcloud app domain-mappings create DOMAIN --certificate-management='MANUAL'
    
API

관리형 SSL 인증서를 프로그래매틱 방식으로 사용 중지하려면 Admin API의 apps.domainMappings.patch 메서드를 사용하여 수동 SSL 관리를 지정합니다.

자체 SSL 인증서 사용

관리형 SSL 인증서 대신 자체 인증서를 사용할 수 있습니다. 인증서에 투명성 증명이 없으면 Chrome의 인증서 투명성 증명 정책으로 인해 앱에 SSL 경고가 표시될 수 있습니다. 인증서 투명성 증명과 준수 방법에 대한 자세한 내용은 인증서 투명성 시행을 참조하세요.

Google에서 관리하는 인증서 대신 자체 SSL 인증서를 사용 및 관리하려면 다음 단계를 따르세요.

  1. App Engine 프로젝트에 이미 커스텀 도메인을 설정했는지 확인합니다.

  2. Google에서 관리하는 기본 인증서를 중지합니다.

  3. 원하는 인증 기관(CA)으로부터 도메인 인증서를 발급 받습니다. 정확한 절차는 기관에 따라 다를 수 있지만 일반적인 단계에 대해서는 인증서 얻기를 참조하세요.

  4. 비공개 키와 SSL 인증서 파일을 App Engine에서 지원되는 형식으로 변환합니다. 파일을 업로드하려면 비공개 키를 RSA 비공개 키로 변환하고 SSL 인증서를 단일 파일로 연결해야 합니다. 자세한 내용은 비공개 키 변환 및 SSL 인증서 연결을 참조하세요.

  5. GCP Console에 적절한 권한이 있고 모든 관련 도메인 또는 상위 도메인에 대한 인증된 소유권(3단계)이 있는지 확인합니다. 예를 들면 다음과 같습니다.

    • www.example.com에 대한 인증서의 경우, www.example.com 또는 example.com의 소유권을 확인하면 됩니다.
    • www.example.comsub.example.com에 대한 인증서의 경우, www.example.comsub.example.com의 소유권 또는 example.com의 소유권을 확인하면 됩니다.
    • *.example.com에 대한 인증서의 경우, example.com의 소유권을 확인해야 합니다.
  6. 비공개 키와 SSL 인증서를 업로드한 후 도메인을 앱에 매핑합니다.

    Console
    1. Google Cloud Platform Console에서 App Engine > 설정 > SSL 인증서로 이동합니다.

      SSL 인증서 페이지로 이동

    2. 새 인증서 업로드를 클릭합니다.

      인증서 업로드
    3. PEM encoded X.509 public key certificate 아래에 있는 연결된 SSL 인증서(예: concat.crt)를 업로드한 후 암호화되지 않은 PEM으로 인코딩된 RSA 비공개 키 아래에 있는 RSA 비공개 키(예: myserver.key.pem)를 업로드합니다.
    4. 업로드를 클릭합니다. 업로드하는 모든 SSL 인증서가 표시되어 다른 모든 GCP 프로젝트에서 사용될 수 있으므로, 동일한 인증서를 반복해서 업로드할 필요가 없습니다.
    5. 도메인에 할당할 인증서를 선택한 후 저장을 클릭하여 해당 도메인에 SSL을 사용합니다.
    gcloud
    1. 다음 gcloud app ssl-certificates 명령어를 실행하여 SSL 인증서와 비공개 키를 업로드합니다.
      gcloud app ssl-certificates create --display-name CERT_DISPLAY_NAME --certificate CERT_DIRECTORY_PATH --private-key KEY_DIRECTORY_PATH

      각 항목의 의미는 다음과 같습니다.

      • CERT_DISPLAY_NAME은 인증서에 사용할 표시 이름입니다.
        예: example.com
      • CERT_DIRECTORY_PATH는 인증서의 디렉터리 경로와 파일 이름입니다.
        예: ./cert.crt
      • KEY_DIRECTORY_PATH는 비공개 키의 디렉터리 경로와 파일 이름입니다.
        예: ./private.key

      예:

      gcloud app ssl-certificates create --display-name example.com --certificate ./cert.crt --private-key ./private.key
    2. 다음 gcloud app domain-mappings 명령어를 실행하고 SSL을 사용하여 도메인과 App Engine 앱 사이에 매핑을 만듭니다.
      gcloud app domain-mappings create DOMAIN --certificate-id CERT_ID

      각 항목의 의미는 다음과 같습니다.

      • DOMAIN은 App Engine 앱에 매핑할 도메인입니다.
        예: *.example.com

        팁: 와일드 카드 매핑 사용 시 오류가 발생하면 '*.example.com'과 같이 도메인을 따옴표로 묶으세요.

      • CERT_ID는 SSL에 사용할 인증서 ID입니다.
        예: --certificate-id 1234

      예:

      gcloud app domain-mappings create '*.example.com' 1234

  7. 브라우저에서 https(예: https://www.example.com)를 사용하여 도메인을 방문하고 변경사항을 테스트합니다.

사용 중인 인증서에서 새 인증서로 매핑 이전하기

인증서 만료일이 다가오면 새 인증서를 업로드하고 이전 인증서의 기존 매핑을 새 인증서로 이전해야 합니다. 다음 절차는 기존 인증서가 아직 만료되지 않았고 현재 커스텀 도메인을 제공하고 있다고 가정합니다.

사용 중인 인증서의 매핑을 이전하는 방법은 다음과 같습니다.

  1. 원하는 인증 기관(CA)으로부터 새 도메인 인증서를 발급 받습니다. 일반적인 단계는 인증서 얻기를 참조하세요.

  2. 비공개 키와 SSL 인증서 파일을 App Engine에서 지원되는 형식으로 변환합니다. 자세한 내용은 비공개 키 변환 및 SSL 인증서 연결을 참조하세요.

  3. RSA 비공개 키와 연결된 SSL 인증서를 업로드합니다.

    콘솔
    1. SSL 인증서 페이지에서 SSL 인증서를 업로드합니다.

      SSL 인증서 페이지로 이동하기
      1. 새 인증서 업로드를 클릭합니다.

        인증서 업로드
      2. PEM으로 인코딩된 X.509 공개 키 인증서 아래에 연결된 SSL 인증서(예: concat.crt)를 업로드한 후 암호화되지 않은 PEM으로 인코딩된 RSA 비공개 키 아래에 RSA 비공개 키(예: myserver.key.pem)를 업로드합니다.
      3. 업로드를 클릭합니다.
    2. 인증서 목록에서 방금 추가한 새 인증서를 선택하고 기존 인증서가 제공하고 있는 도메인을 선택합니다.
    3. 저장을 클릭하여 기존 인증서의 매핑을 새 인증서로 이전합니다.
    gcloud

    다음 gcloud app ssl-certificates 명령어를 실행하여 SSL 인증서와 비공개 키를 업데이트합니다.

    gcloud app ssl-certificates update CERT_ID --certificate CERT_DIRECTORY_PATH --private-key KEY_DIRECTORY_PATH

    각 항목의 의미는 다음과 같습니다.

    • CERT_ID는 업데이트할 SSL 인증서의 ID입니다.
      예: 1234
    • CERT_DIRECTORY_PATH는 SSL 인증서의 디렉터리 경로와 파일 이름입니다.
      예: ./cert.crt
    • KEY_DIRECTORY_PATH는 비공개 키의 디렉터리 경로와 파일 이름입니다.
      예: ./private.key

    예:

    gcloud app ssl-certificates update 1234 --certificate ./cert.crt --private-key ./private.key

인증서 가져오기

SSL 인증서를 얻는 절차는 사용하는 인증 기관에 따라 다릅니다. 여기에서의 안내는 실제와 약간 다를 수 있습니다. 일반적으로 각 인증 기관이 절차를 자세하게 안내합니다.

App Engine 앱에 사용할 인증서를 얻으려면 다음 단계를 따르세요.

  1. openssl 도구를 사용하여 비공개 키와 인증서 서명 요청(CSR)을 생성합니다.

    1. server.csr 파일을 만들 디렉터리에서 다음 명령어를 실행합니다.

      openssl req -nodes -newkey rsa:2048 -keyout [MY_PRIVATE_KEY].key -out [MY_CSR].csr
      

      각 항목의 의미는 다음과 같습니다.

      • [MY_PRIVATE_KEY].key는 비공개 키를 저장하기 위해 생성되는 파일입니다. 예: myserver.key
      • [MY_CSR].csr은 인증서 서명 요청을 위해 생성되는 파일입니다. 예: server.csr
    2. 메시지가 표시되면 다음 정보를 입력합니다.

      • 2자리 국가 코드(예: 미국의 경우 US)
      • 도시 이름
      • 회사 이름. 회사가 없으면 본인 이름을 입력할 수 있습니다.
      • 조직 단위 또는 NA(없는 경우)
      • 도메인을 나타내는 일반적인 이름(예: www.example.com)
      • 이메일 주소

      다른 값은 모두 선택사항이므로, 입력하지 않아도 됩니다.

  2. 자신에게 맞는 인증 기관을 선택한 후 인증서를 구매합니다. 예를 들어 SSLMate, Thawte, Comodo, 기타 인증 기관을 사용할 수 있습니다.

    지원되는 인증서 유형에 대한 자세한 내용은 App Engine의 SSL 인증서 지원을 참조하세요.

  3. CA가 CSR 파일 콘텐츠를 요청하면 안내에 따라 앞에서 생성한 .csr 파일(예: server.csr)의 콘텐츠를 복사하여 붙여넣습니다.

  4. CA가 도메인 소유자 승인을 요청하면 표시되는 메시지를 따릅니다.

    팁: 이메일 승인 방법이 가장 간편할 수 있습니다. 이렇게 하려면 CA의 승인 요청을 수신 및 응답할 수 있도록 도메인 계정에 이메일 주소(예: admin@example.com)를 구성해야 합니다.

  5. 사용자가 도메인 소유자 승인을 제공하면 CA가 사용자에게 인증서를 전송합니다. 인증서는 일반적으로 .zip 파일 형식입니다. 여러 인증서를 연결하여 App Engine에 업로드할 수 있도록 작업 디렉터리에 파일 압축을 풉니다.

비공개 키 변환 및 SSL 인증서 연결

App Engine에 비공개 키와 SSL 인증서를 업로드하기 전에 비공개 키를 RSA 비공개 키로 변환하고 모든 SSL 인증서를 연결해야 합니다.

  1. 앞에서 생성한 비공개 키를 암호화되지 않은 RSA 비공개 키로 변환합니다. 예를 들어 다음 openssl rsa 명령어를 실행할 수 있습니다.

    openssl rsa -in [MY_PRIVATE_KEY].key -out [MY_RSA_KEY].key.pem
    

    각 항목의 의미는 다음과 같습니다.

    • [MY_PRIVATE_KEY].key는 비공개 키를 저장하기 위해 생성되는 파일입니다. 예: myserver.key
    • [MY_RSA_KEY].key는 암호화되지 않은 RSA 비공개 키를 저장하기 위해 생성되는 파일입니다. 예: myserver.key.pem

      예:

      openssl rsa -in myserver.key -out myserver.key.pem
      
  2. 다음 명령어를 사용하여 CA의 모든 .crt 파일을 단일 파일로 연결합니다.

    cat [MY_DOMAIN_CERT].crt [MY_SecureServerCA].crt [MY_TrustCA].crt [MY_TrustExternalCARoot].crt > [MY_CONCAT_CERT].crt
    

    각 항목의 의미는 다음과 같습니다.

    • [MY_DOMAIN_CERT].crt는 도메인 인증서입니다. 예: www_example_com.crt
    • [MY_SecureServerCA].crt, [MY_TrustCA].crt, [MY_TrustExternalCARoot].crt는 CA가 제공한 기타 인증서 파일입니다.
    • [MY_CONCAT_CERT].crt는 CA의 모든 .crt 인증서 파일을 포함하는 연결된 파일입니다. 예: concat.crt

      예:

      cat www_example_com.crt AddTrustExternalCARoot.crt RSADomainValidationSecureServerCA.crt RSAAddTrustCA.crt > concat.crt
      
  3. SSL 인증서와 비공개 키를 확인합니다.

    1. openssl x509 명령어와 openssl rsa 명령어를 사용하여 비공개 키와 인증서가 일치하는지 확인할 수 있습니다. 예를 들면 다음과 같습니다.

      openssl x509 -noout -modulus -in concat.crt | openssl md5
      openssl rsa -noout -modulus -in myserver.key.pem | openssl md5
      

      openssl x509 명령어와 openssl rsa 명령어 모두 동일한 결과를 반환해야 합니다.

    2. openssl verify 명령어를 사용하여 인증서와 해당 CA 체인이 유효한지 확인할 수 있습니다. 예를 들면 다음과 같습니다.

      openssl verify -verbose -CAfile concat.crt concat.crt
      
  4. 준비가 완료되면 RSA 비공개 키와 연결된 인증서를 App Engine에 업로드할 수 있습니다.

App Engine의 SSL 인증서 지원

App Engine은 다음과 같은 인증서 유형을 지원합니다.

  • 단일 도메인/호스트 이름
  • 자체 서명
  • 와일드 카드
  • 주체 대체 이름(SAN)/여러 도메인

인증서와 키에 대한 요건은 다음과 같습니다.

  • 비공개 키와 인증서를 PEM 형식으로 업로드해야 합니다.
  • 비공개 키를 암호화하면 안 됩니다.
  • 인증서 파일 한 개에는 연결 인증서 및 중간 인증서를 포함하여 인증서가 최대 5개까지 포함될 수 있습니다.
  • 호스트 인증서의 모든 주체 이름은 사용자가 인증한 도메인과 일치하거나 해당 도메인의 하위 도메인이어야 합니다.
  • 비공개 키는 RSA 암호화를 사용해야 합니다.
  • 최대 허용 키 모듈러스는 2,048비트입니다.

호스트 인증서에 중간 인증서 또는 연결 인증서가 필요한 경우(다수의 인증 기관(CA)에서 이렇게 발급함), 공개 인증서 파일 끝에 중간 인증서 또는 연결 인증서를 추가해야 합니다.

일부 App Engine 기능은 특수 하위 도메인을 사용합니다. 예를 들어 애플리케이션이 하위 도메인을 사용하여 애플리케이션 서비스를 처리하거나 애플리케이션의 여러 가지 버전을 처리할 수 있습니다. 이러한 경우에 SSL을 사용하려면 SAN 또는 와일드 카드 인증서를 설정하는 것이 좋습니다. 와일드 카드 인증서는 하나의 하위 도메인 수준만 지원합니다.

Strict-Transport-Security 헤더 사용

보안상의 이유로 모든 애플리케이션은 클라이언트가 https 연결을 사용하도록 권장해야 합니다. Strict-Transport-Security 헤더를 사용하여 브라우저가 http보다 https를 우선적으로 사용하도록 브라우저에 지시할 수 있습니다.

HTTP Strict Transport Security를 구현할 때는 주의가 필요합니다. https가 어떠한 이유로 작동하지 않거나 중지되면 이전에 헤더를 수신했던 클라이언트가 연결을 거부합니다. 자세한 내용은 HTTP Strict Transport Security 요약본을 참조하세요.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Java 문서용 App Engine 가변형 환경