ESP를 사용하여 Cloud Endpoints용 SSL 사용 설정

이 페이지에서는 Google Kubernetes Engine, Kubernetes 또는 Compute Engine으로 Extensible Service Proxy(ESP)를 배포할 때, 보안 소켓 레이어(SSL) 포트를 어떻게 사용 설정하는지 설명합니다. 일부 사용 사례의 경우 배포된 Endpoints 서비스에 SSL 포트를 사용 설정해야 할 수도 있습니다. 예를 들어 gRPC의 트랜스코딩 기능을 사용하는 경우, 서비스가 동일 포트에서 HTTP 1.1 및 gRPC 요청을 수신하도록 할 수 있습니다.

시작하기 전에 선택한 서비스 유형 및 환경에 대한 가이드를 검토하고 SSL 없이 ESP를 배포하는 방법을 알아두어야 합니다.

SSL 키 및 인증서 구성

HTTPS 요청을 처리하도록 SSL 포트를 구성하려면 다음 단계를 따르세요.

  1. SSL 키 파일 이름이 nginx.key이고 인증서 파일 이름이 nginx.crt인지 확인합니다. 테스트를 위해 다음 명령어로 OpenSSL을 사용하여 자체 서명된 nginx.keynginx.cert를 생성할 수 있습니다.

    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
    -keyout ./nginx.key -out ./nginx.crt
  2. 서버 인증서에 CNsubjectAltName을 모두 지정하세요. 이러한 속성 값은 클라이언트가 서비스를 호출하는 데 사용하는 DNS 또는 IP와 일치해야 합니다. 그렇지 않으면 SSL 핸드셰이크가 실패합니다.

Kubernetes에서 ESP에 SSL 사용 설정

Kubernetes에서 ESP에 SSL 포트를 사용 설정하려면 다음 안내를 따르세요.

  1. SSL 키와 인증서로 Kubernetes 보안 비밀을 만듭니다.

    kubectl create secret generic nginx-ssl \
    --from-file=./nginx.crt --from-file=./nginx.key
  2. Kubernetes 구성 파일(예: esp_echo_gke.yaml)을 다음 스니펫에 표시된 대로 수정합니다.

    template:
      metadata:
        labels:
          app: esp-echo
      spec:
        volumes:
        - name: nginx-ssl
          secret:
            secretName: nginx-ssl
        containers:
        - name: esp
          image: gcr.io/endpoints-release/endpoints-runtime:1
          args: [
            "--http_port", "8080",
            "--ssl_port", "443",
            "--backend", "127.0.0.1:8081",
            "--service", "SERVICE_NAME",
            "--rollout_strategy", "managed",
          ]
          ports:
            - containerPort: 8080
            - containerPort: 443
          volumeMounts:
          - mountPath: /etc/nginx/ssl
            name: nginx-ssl
            readOnly: true
        - name: echo
          image: gcr.io/endpoints-release/echo:latest
          ports:
            - containerPort: 8081

    참고: 이 구성 샘플은 수정이 필요한 행을 표시합니다. 파일을 Cloud Endpoints에 배포하려면 전체 구성 파일이 필요합니다.

  3. Kubernetes 볼륨 페이지의 지침에 따라 볼륨으로 만든 Kubernetes 보안 비밀을 마운트합니다.

  4. ESP의 시작 옵션 지정에 설명된 대로 ESP를 시작하되, 시작 플래그 --ssl_port를 추가하여 SSL 포트를 사용 설정해야 합니다. 기본 SSL 포트는 443입니다.

  5. kubectl을 사용하여 업데이트된 Kubernetes 구성 파일로 서비스를 시작합니다.

    kubectl apply -f esp_echo_gke.yaml

SSL 인증서 업데이트

SSL 인증서를 정기적으로 업데이트하는 것이 중요합니다. SSL 인증서를 업데이트하려면 다음 단계를 수행해야 합니다.

  • 위의 1단계에 설명된 대로 새 인증서를 만듭니다.
  • 위의 3단계에 설명된 대로 새 인증서를 Kubernetes 보안 비밀에 마운트합니다.
  • 위의 5단계에 설명된 대로 ESP Kubernetes 배포를 업데이트합니다.

Compute Engine에서 ESP에 SSL 사용 설정

Compute Engine에서 SSL을 사용 설정하려면 먼저 다음 단계에 따라 Compute Engine 인스턴스의 /etc/nginx/ssl 폴더에 nginx.keynginx.crt 파일을 복사합니다.

  1. 다음 명령어를 실행하고 INSTANCE_NAME을 Compute Engine 인스턴스의 이름으로 바꿉니다.

    gcloud compute scp nginx.* INSTANCE-NAME
    
  2. ssh를 사용하여 인스턴스에 연결합니다.

    gcloud compute ssh INSTANCE-NAME
  3. 인스턴스 VM 박스에 디렉터리를 만들고 파일을 복사합니다.

      sudo mkdir -p /etc/esp/ssl
      sudo cp server.* /etc/esp/ssl/
  4. Docker를 사용하여 배포하려면 해당 서비스 유형에 대한 안내를 따르세요. ESP Docker 컨테이너를 실행할 때는 다음 명령어를 사용하세요.

    sudo docker run --name=esp \
     --detach \
     --publish=443:443 \
     --net=esp_net \
     --volume=/etc/nginx/ssl:/etc/nginx/ssl \
     --link=echo:echo \
     gcr.io/endpoints-release/endpoints-runtime:1 \
     --service=SERVICE_NAME \
     --rollout_strategy=managed \
     --backend=echo:8080 \
     --ssl_port=443

    SSL이 아닌 docker run 명령어와 비교할 때 명령어의 SSL 버전은 다른 구성을 만듭니다. 예를 들어 SSL 명령어는 다음을 수행합니다.

    • --volume을 사용하여 키와 CRT 파일이 있는 폴더를 컨테이너에 마운트합니다.
    • --ssl_port=443을 사용하여 ESP에서 포트 443에 SSL을 사용 설정하도록 합니다.
    • 포트 매핑 플래그 --publish를 변경합니다.

SSL 인증서 업데이트

SSL 인증서를 정기적으로 업데이트하는 것이 중요합니다. SSL 인증서를 업데이트하려면 다음 단계를 수행해야 합니다.

  • 위의 1단계에 설명된 대로 새 인증서를 만들어 VM 인스턴스에 복사합니다.
  • 위의 3단계에 설명된 대로 새 인증서를 /etc/esp/ssl 디렉터리에 복사합니다.
  • 위의 4단계에 설명된 대로 sudo docker run 명령어를 사용하여 ESP 컨테이너를 중지하고 다시 시작합니다.

SSL 포트 테스트

더욱 간편하게 테스트할 수 있도록 다음 환경 변수를 설정합니다.

  1. IP_ADDRESS를 새 SSL 인증서가 있는 Compute Engine 인스턴스의 IP 주소로 설정합니다.

  2. ENDPOINTS_KEY를 유효한 API 키로 설정합니다.

SSL 포트가 사용 설정되면 HTTPS를 사용하여 Extensible Service Proxy에 요청을 보낼 수 있습니다. 인증서가 자체 서명된 경우 -k를 사용하여 curl에서 비보안 옵션을 사용 설정합니다.

curl -k -d '{"message":"hello world"}' -H "content-type:application/json" \
https://IP_ADDRESS:443/echo?key=ENDPOINTS_KEY

또는 아래와 같이 pem 형식의 인증서를 생성하고 --cacert 옵션을 사용하여 아래와 같이 curl에서 자체 서명된 인증서를 사용합니다.

  openssl x509 -in nginx.crt -out nginx.pem -outform PEM
  curl --cacert "./nginx.pem" -d '{"message":"hello world"}' -H "content-type:application/json" \
  https://IP_ADDRESS:443/echo?key=ENDPOINTS_KEY