SSL로 커스텀 도메인 보호

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

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

시작하기 전에

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

  • Cloud Load Balancing과 서버리스 NEGS를 사용하여 트래픽을 App Engine 앱으로 라우팅하는 경우 커스텀 도메인을 직접 앱이 아닌 부하 분산기에 매핑하고 부하 분산기에 생성된 SSL 인증서를 사용하는 것이 좋습니다. 이렇게 하면 서버리스 앱마다 별도의 SSL 인증서를 관리할 필요가 없습니다. 또한 Cloud Load Balancing을 사용하면 SSL 정책을 설정하여 부하 분산기가 클라이언트와 협상하는 SSL 기능을 제어할 수 있습니다. 자세한 내용은 다음 페이지를 참조하세요.

    다음과 같은 제한사항이 있습니다.

    • 앱이 부하 분산기(및 사용하는 경우 VPC)에서 전송되는 요청만 수신하도록 인그레스 제어를 사용하는 것이 좋습니다. 그렇지 않으면 사용자가 앱의 App Engine URL을 사용하여 부하 분산기를 통해 전달되는 부하 분산기, Google Cloud Armor 보안 정책, SSL 인증서, 비공개 키를 우회할 수 있습니다.

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

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

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

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

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

  2. SSL 보안Google 관리로 표시됩니다.

관리형 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 인증서를 추가하려면 다음과 같이 도메인 매핑을 업데이트합니다.

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

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

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

관리형 SSL 인증서 중지

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

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

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

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

자체 SSL 인증서 사용

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

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

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

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

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

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

  5. Google Cloud 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 인증서를 업로드한 후 도메인을 앱에 매핑합니다.

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

      SSL 인증서 페이지로 이동

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

    3. PEM encoded X.509 public key certificate 아래에 있는 연결된 SSL 인증서(예: concat.crt)를 업로드한 후 암호화되지 않은 PEM으로 인코딩된 RSA 비공개 키 아래에 있는 RSA 비공개 키(예: myserver.key.pem)를 업로드합니다.
    4. 업로드를 클릭합니다. 업로드한 각 SSL 인증서는 다른 모든 Cloud 프로젝트에서 보이고 사용 가능하므로 동일한 인증서를 반복해서 업로드할 필요가 없습니다.
    5. 도메인에 할당할 인증서를 선택한 후 저장을 클릭하여 해당 도메인에 SSL을 사용합니다.

  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. 저장을 클릭하여 기존 인증서의 매핑을 새 인증서로 이전합니다.

인증서 얻기

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가 도메인 소유자 승인을 요청하면 표시되는 메시지를 따릅니다.

  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 또는 와일드 카드 인증서를 설정하는 것이 좋습니다. 와일드 카드 인증서는 하나의 하위 도메인 수준만 지원합니다.

커스텀 SSL 인증서 삭제

커스텀 SSL 인증서 사용을 중지하려면 다음 단계를 수행합니다.

  1. Google Cloud 콘솔에서 App Engine SSL 인증서 설정 페이지로 이동합니다.

    SSL 인증서 설정으로 이동

  2. 도메인에서 삭제할 인증서를 클릭합니다.

  3. SSL 인증서를 더 이상 사용하지 않을 도메인 이름을 선택 해제한 후 저장을 클릭합니다.

Strict-Transport-Security 헤더 사용

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

사용 설정된 TLS 버전 및 암호화 보기

  1. nmap Network Mapper가 아직 없으면 컴퓨터에 설치합니다. 설치 안내는 https://nmap.org/를 참조하세요.

  2. 앱에 사용 설정된 TLS 버전 및 암호화를 확인하려면 다음 명령어를 입력합니다.

    nmap -sV --script ssl-enum-ciphers -p 443 hostname

    hostname을 앱의 호스트 이름으로 바꿉니다. 커스텀 도메인을 사용하거나 App Engine에서 앱에 생성된 appspot.com 호스트 이름을 사용할 수 있습니다. 예를 들면 다음과 같습니다.

    nmap -sV --script ssl-enum-ciphers -p 443 example.uc.r.appspot.com

TLS 버전 및 암호화 사용 중지

Cloud Load Balancing 및 서버리스 NEGS를 사용하여 트래픽을 App Engine 앱으로 라우팅하는 경우 HTTPS 또는 SSL 연결에 사용할 수 있는 TLS 버전 및 암호화를 지정하는 SSL 보안 정책을 정의하여 TLS 버전 또는 암호화를 중지할 수 있습니다.