-
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 설치
1sudo apt update -y & sudo apt install letsencrypt -ycs 긴 목록이 주르륵 뜨면서 작업이 진행되면 성공입니다.
2. nginx 중지
1sudo systemctl stop nginxcs letsencrypt는 인증서 발급을 위해 80포트를 사용합니다. 그러므로 기존에 80포트를 listen 하던 nginx를 잠시 꺼둡니다.
1netstat -antcs 열려있는 포트를 확인하고 80포트를 사용중인 프로세스가 없다면 인증서 발급을 시작합니다.
3. 인증서 발급
1sudo letsencrypt certonly --standalone -d www.yourdomain.comcs 발급 받을 도메인으로 인증서 발급 과정을 시작합니다.
소유자 이메일을 적고 OK (엔터 치면 됩니다)
사용 약관에 동의하십니까? 하는 것에 Agree. (엔터)
1234567891011121314151617IMPORTANT NOTES:- If you lose your account credentials, you can recover throughe-mails sent to gdtbgl93@gmail.com.- Congratulations! Your certificate and chain have been saved at/etc/letsencrypt/live/www.hellodocent.net/fullchain.pem. Your certwill expire on 2018-11-19. To obtain a new version of thecertificate in the future, simply run Let's Encrypt again.- Your account credentials have been saved in your Let's Encryptconfiguration directory at /etc/letsencrypt. You should make asecure backup of this folder now. This configuration directory willalso contain certificates and private keys obtained by Let'sEncrypt 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/donateDonating to EFF: https://eff.org/donate-lecs 그럼 이런 화면이 뜨면서 발급이 완료되었다고 나옵니다.
4. nginx 설정 파일이 있는 경로로 이동합니다.
먼저 /etc/nginx/밑에 있는 nginx.conf 파일을 열어서 톰캣과 연결될 부분을 설정해 줍니다.
< /etc/nginx/nginx.conf >
12345678910111213141516### Virtual Host Configs##include /etc/nginx/conf.d/*.conf;include /etc/nginx/sites-enabled/*;# for tomcat jspupstream 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 >
123456789101112131415161718192021# 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 configurationcs 그리고 기본 서버 설정 안에 있는 location 부분에 프록시 설정을 해 줍니다.
12345678910111213141516171819location / {# 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; 이 부분을 추가 해 주세요.
12345678910111213141516# 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 커넥터 부분을 수정합니다.
12345<Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"URIEncoding="UTF-8" redirectPort="443"proxyPort="443" scheme="https" />cs 7. nginx를 다시 작동 시켜 주시고, 포트를 확인하여 80과 443 모두 잘 돌아가는지 확인합니다.
1systemctl start nginxcs 톰캣도 같이 재시작 해 주세요.
12sudo service tomcat8 restartcs 아파치를 사용하면서 겪었던 많은 문제들이 nginx를 사용하면서 간단하게 처리된 것 같습니다.
본 포스팅은 아래의 블로그에서 많은 도움을 받았습니다.
'IT, 프로그래밍 > Linux' 카테고리의 다른 글
[CentOS] JDK 컴파일 설치 및 서버 환경설정 (1) 2019.03.20 [CentOS] putty를 사용해서 SSH로 접속하기 (1) 2019.03.18 [CentOS] VirtualBox로 가상 리눅스 환경 설정하기 (0) 2019.03.15 Tomcat과 Nginx를 연동 (도메인 연결) (1) 2018.08.21 Ubuntu Timezone 설정 (0) 2018.08.18