AWS + nginx으로 내 사이트 https 적용시키기
이번 포스팅은 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를 사용하면서 간단하게 처리된 것 같습니다.
본 포스팅은 아래의 블로그에서 많은 도움을 받았습니다.