본문 바로가기
서버/클라우드

ELB 에 HTTPS 설정하기...

by 사악신 2017. 4. 13.

먼저, Certificate Manager 로 들어가 인증서 가져오기를 선택합니다.

 

인증서 본문에는 crt 파일을, 인증서 프라이빗 키에는 key 파일의 내용을 복사하여 붙여넣습니다. 인증서 체인에는 체인 파일의 내용을 복사하여 붙여넣습니다.

 

 

만약, key 파일 생성시 비밀번호를 사용하였다면 이를 제거하고 사용합니다.(파일명은 상황에 맞게 고쳐씁니다.)

 

openssl rsa -in ssl.key -out ssl-nopass.key

 

이제 ELB 설정에서 Listeners 를 추가합니다.

 

 

기존 EC2 에 설치되어 있는 웹서버(nginx)의 SSL 옵션을 사용하지 않을거라서 Instance Protocol 은 HTTP 로 설정합니다. 따라서 Health Check 도 기존 HTTP 설정을 그대로 사용합니다. 이에 nginx 설정에 아래 내용을 추가합니다.

 

 

 

    set $redirect_https 0;

    if ($http_x_forwarded_proto != "https") {

        set $redirect_https 1;

    }

    if ($request_uri = '/heartbeat') {

        set $redirect_https 0;

    }

    if ($redirect_https = 1) {

        return 301 https://도메인주소$request_uri;

    }

 

 

약간의 설명을 부연하자면, 프로토콜이 http 인 경우, https 로 리다이렉트하지만 Health Check 인 경우(/heartbeat 으로 설정)는 리다이렉트하지않습니다.

 

물론, Instance Protocol 을 HTTPS 로 지정하고 직접 웹서버에 SSL 설정을 하는 방법도 있습니다.

 


 

무료로 인증서를 사용할 경우, ELB 에서는 letsencrypt 를 사용하기 보다 AWS 의 ACM 을 이용하는 것이 좋습니다.

 

 

이때, 생성 과정에서 Route53 에 값을 자동으로 입력하는 부분이 있으니, 해당 기능을 사용하여 DNS 정보를 추가합니다. ELB 의 설정은 아래와 같이 "ACM에서 인증서 선택" 을 사용합니다.

 


라라벨의 경우, app\Http\Middleware\TrustProxies.php 를 아래와 같이 수정합니다.

<?php

namespace App\Http\Middleware;

use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;

class TrustProxies extends Middleware
{
    /**
     * The trusted proxies for this application.
     *
     * @var array|string
     */
    protected $proxies = '*';

    /**
     * The headers that should be used to detect proxies.
     *
     * @var int
     */
    protected $headers = Request::HEADER_X_FORWARDED_AWS_ELB;
}

로드밸런서의 IP 값을 알 수 없기에 $proxies 의 값을 * 로 처리하였습니다.

 

반응형

댓글