ESPv2로 Cloud Endpoints용 SSL 사용 설정

이 페이지에서는 Google Kubernetes Engine, Kubernetes 또는 Compute Engine으로 Extensible Service Proxy V2(ESPv2)를 배포할 때 보안 소켓 레이어(SSL) 포트를 사용 설정하는 방법을 설명합니다. 일부 사용 사례의 경우 배포된 Endpoints 서비스에 SSL 포트를 사용 설정해야 할 수도 있습니다.

시작하기 전에 선택한 서비스 유형 및 환경에 대한 가이드를 이미 검토하고 SSL 없이 ESPv2를 배포하는 방법을 알아보세요.

SSL 키 및 인증서 구성

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

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

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

Kubernetes에서 ESPv2에 SSL 사용 설정

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

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

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

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

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

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

  4. ESPv2의 시작 옵션 지정에 설명된 대로 ESPv2를 시작하되, 시작 플래그 --ssl_server_cert_path를 추가하여 마운트된 인증서 파일의 경로를 지정합니다.

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

    kubectl apply -f echo-ssl.yaml

  6. 다음 OpenSSL 명령어를 사용하여 클라이언트의 루트 인증서를 생성합니다.

       openssl x509 -in ./server.crt -out ./client.pem -outform PEM
     

    클라이언트가 curl를 사용 중인 경우 --caroot 플래그에서 client.pem 파일을 사용할 수 있습니다. gRPC의 경우 client.pem은 gRPC 채널에 대한 SSL 인증서의 루트 인증서 파일로 사용됩니다.

SSL 인증서 업데이트

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

  • 위의 1단계에 설명된 대로 새 인증서를 만듭니다.
  • 위의 3단계에 설명된 대로 새 인증서를 Kubernetes 보안 비밀에 마운트합니다.
  • 위의 5단계에 설명된 대로 ESPv2 Kubernetes 배포를 업데이트합니다.
  • 위의 6단계에 설명된 대로 클라이언트 루트 인증서 파일을 다시 생성합니다.

Compute Engine에서 ESPv2에 SSL 사용 설정

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

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

    gcloud compute scp server.* 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를 사용하여 배포하려면 해당 서비스 유형에 대한 안내를 따르세요. ESPv2 Docker 컨테이너를 실행할 때는 다음 명령어를 사용하세요.

    sudo docker run --name=esp \
     --detach \
     --publish=443:9000 \
     --net=esp_net \
     --volume=/etc/esp/ssl:/etc/esp/ssl \
      gcr.io/endpoints-release/endpoints-runtime:2 \
     --service=SERVICE_NAME \
     --rollout_strategy=managed \
     --backend=echo:8080 \
     --ssl_server_cert_path=/etc/esp/ssl \
     --listener_port=9000

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

    • --volume을 사용하여 키와 CRT 파일이 있는 폴더를 컨테이너에 마운트합니다.
    • --ssl_server_cert_path=/etc/esp/ssl을 사용하여 ESPv2에 /etc/esp/ssl 폴더에서 서버 인증서 파일 server.keyserver.crt를 찾도록 알려줍니다.
    • 포트 매핑 플래그 --publish를 변경합니다. HTTPS 포트 443에 대해 들어오는 요청이 ESPv2 포트 9000에 매핑됩니다.

SSL 인증서 업데이트

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

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

SSL 포트 테스트

SSL 포트를 더 쉽게 테스트할 수 있도록 다음 환경 변수를 설정합니다.

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

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

SSL 포트가 사용 설정되면 HTTPS를 사용하여 확장 가능 서비스 프록시에 요청을 보낼 수 있습니다. 인증서가 자체 서명된 경우 -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 server.crt -out client.pem -outform PEM
  curl --cacert "./client.pem" -d '{"message":"hello world"}' -H "content-type:application/json" \
  https://IP_ADDRESS:443/echo?key=ENDPOINTS_KEY