ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AWS + nginx으로 내 사이트 https 적용시키기
    IT, 프로그래밍/Linux 2018. 8. 22. 02:38

    이번 포스팅은 AWS와 nginx를 통해 인증서를 적용시키는 예제 입니다.


    최근 보안의 중요성이 커져서 https가 아니면 지원이 안되는 서비스들이 늘어나고 있습니다. (예를 들면 페이스북)


    그에 맞게 인증서를 발급받아 적용시키는게 미래를 위해서 좀 더 편할 수 있습니다.


    우선 환경은 AWS EC2, Ubuntu 16.04, tomcat8, nginx 1.10.3을 사용하고 있습니다.


    인증서는 무료 인증서인 Letsencrypt를 사용합니다. 인증서를 발급받기 위해서는 퍼블릭 도메인을 꼭 가지고 있어야 합니다. (IP로만 접근 안됨)


    만약 nginx를 설치하지 않으셨다면 패키지 관리 프로그램 (apt-get 등)을 사용해서 설치하여 주시고 톰캣과 연동 시키는 방법은 이 포스팅을 참고하세요 --> http://gdtbgl93.tistory.com/96


    우선 워크 플로우는 아래와 같습니다.


    1. SSL 인증서 발급

    2. 설정 파일에서 443 포트를 기본으로 설정

    3. 발급받은 인증서를 탑재

    4. 80포트로 들어오는 연결을 443으로 리다이렉트 할 수 있도록 설정


    기본적인 개념은 톰캣이 직접 https 요청을 처리하는 것이 아니라, 443 포트로 들어오는 https 요청을 nginx가 모두 처리하고, 톰캣은 내부적으로 리다이렉트되는 http 요청을 8080포트로 리슨하여 처리하는 것이 핵심입니다. 


    저도 이 부분에 혼동이 있어서 고생을 했는데요. 톰캣쪽 server.xml 설정은 ssl 설정을 해주는게 아니라 프록시에 대한 설정만 추가 해 주면 됩니다.



    1. letsencrypt 설치 


    1
     sudo apt update -y & sudo apt install letsencrypt -y
    cs


    긴 목록이 주르륵 뜨면서 작업이 진행되면 성공입니다.


    2. nginx 중지


    1
     sudo systemctl stop nginx
    cs

    letsencrypt는 인증서 발급을 위해 80포트를 사용합니다. 그러므로 기존에 80포트를 listen 하던 nginx를 잠시 꺼둡니다. 


    1
    netstat -ant
    cs


    열려있는 포트를 확인하고 80포트를 사용중인 프로세스가 없다면 인증서 발급을 시작합니다.


    3. 인증서 발급


    1
    sudo letsencrypt certonly --standalone -d www.yourdomain.com
    cs

    발급 받을 도메인으로 인증서 발급 과정을 시작합니다.



    소유자 이메일을 적고 OK (엔터 치면 됩니다)



    사용 약관에 동의하십니까? 하는 것에 Agree. (엔터)


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    IMPORTANT NOTES:
     - If you lose your account credentials, you can recover through
       e-mails sent to gdtbgl93@gmail.com.
     - Congratulations! Your certificate and chain have been saved at
       /etc/letsencrypt/live/www.hellodocent.net/fullchain.pem. Your cert
       will expire on 2018-11-19. To obtain a new version of the
       certificate in the future, simply run Let's Encrypt again.
     - Your account credentials have been saved in your Let's Encrypt
       configuration directory at /etc/letsencrypt. You should make a
       secure backup of this folder now. This configuration directory will
       also contain certificates and private keys obtained by Let's
       Encrypt so making regular backups of this folder is ideal.
     - If you like Let's Encrypt, please consider supporting our work by:
     
       Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
       Donating to EFF:                    https://eff.org/donate-le
     
    cs


    그럼 이런 화면이 뜨면서 발급이 완료되었다고 나옵니다. 


    4. nginx 설정 파일이 있는 경로로 이동합니다.


    먼저 /etc/nginx/밑에 있는 nginx.conf 파일을 열어서 톰캣과 연결될 부분을 설정해 줍니다.


    < /etc/nginx/nginx.conf >


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
      ##
            # Virtual Host Configs
            ##
     
            include /etc/nginx/conf.d/*.conf;
            include /etc/nginx/sites-enabled/*;
     
            # for tomcat jsp
            upstream tomcat {
            ip_hash;
     
     
            server 127.0.0.1:8080;
        }
     
     
    cs



    upstream tomcat 부분을 추가해 주세요.


    그 다음에는 default 설정 파일을 수정 해야 합니다.


    저의 경우에는 /etc/nginx/sites-available 밑에 default 설정 파일이 있었습니다.


    여기에 server 밑에 아래와 같이 정의해 줍니다. 443 포트를 아래와 같이 설정해 주세요. 


    < /etc/nginx/sites-available/default >


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    # Default server configuration
    #
    server {
            listen 80 default_server;
            listen [::]:80 default_server;
     
            listen 443 ssl;
            listen [::]:443 ssl;
     
            ssl_certificate  /etc/letsencrypt/live/www.yourdomain.com/fullchain.pem;
            ssl_certificate_key  /etc/letsencrypt/live/www.yourdomain.com/privkey.pem;
     
            ssl_session_cache shared:SSL:1m;
            ssl_session_timeout  10m;
            ssl_ciphers HIGH:!aNULL:!MD5;
            ssl_prefer_server_ciphers on;
     
     
            # SSL configuration
     
    cs



    그리고 기본 서버 설정 안에 있는 location 부분에 프록시 설정을 해 줍니다.


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
            location / {
                    # First attempt to serve request as file, then
                    # as directory, then fall back to displaying a 404.
     
                    proxy_set_header  Host $http_host;
                    proxy_set_header  X-Real-IP $remote_addr;
                    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_set_header  X-Forwarded-Proto $scheme;
                    proxy_set_header  X-NginX-Proxy true;
     
                    proxy_pass http://tomcat;
                    proxy_redirect off;
                    charset utf-8;
     
     
            }
     
    cs



    proxy_pass는 아까 nginx.conf 파일에 톰캣과 연결 설정을 해 줄때 해주었던 이름과 동일하게 (=tomcat) 으로 해 주어야 합니다.



    5. 그리고 80포트로 들어온 요청을 443으로 리다이렉트 시키는 설정 작업입니다.


    밑에 주석쳐진 server 부분에 80포트에 관한 부분이 있는데, 여기에 리다이렉트 시키는 설정을 추가 해 줍니다.


    return 301 https://$host$request_uri;  이 부분을 추가 해 주세요.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # Virtual Host configuration for example.com
    #
    # You can move that to a different file under sites-available/ and symlink that
    # to sites-enabled/ to enable it.
    #
    server {
            listen 80;
            listen [::]:80;
     
            server_name yourdomain.com;
     
            return 301 https://$host$request_uri;
     
            #root /var/www/example.com;
            #index index.html;
     
    cs




    6. 톰캣의 server.xml 설정 파일을 수정합니다.


    /var/lib/tomcat8/conf 아래에 있는 server.xml 파일을 열어서, http 커넥터 부분을 수정합니다.



    1
    2
    3
    4
    5
     <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   URIEncoding="UTF-8" redirectPort="443"
                    proxyPort="443"  scheme="https" />
     
    cs



    7. nginx를 다시 작동 시켜 주시고, 포트를 확인하여 80과 443 모두 잘 돌아가는지 확인합니다.


    1
    systemctl start nginx
    cs

    톰캣도 같이 재시작 해 주세요.


    1
    2
     sudo service tomcat8 restart 
    cs


    아파치를 사용하면서 겪었던 많은 문제들이 nginx를 사용하면서 간단하게 처리된 것 같습니다.


    본 포스팅은 아래의 블로그에서 많은 도움을 받았습니다.


    https://rsec.kr/?p=182


    https://kr.minibrary.com/353/#comment-4052078787

Designed by Tistory.