SSL 인증서는 '도메인(or 서브도메인)' 에 대한 발급입니다.
SSL 발급 신청서의 도메인은 DNS 서버에 설정 후, 전세계 어디에서나 공개 조회되고 있는 상태이어야 힙니다. (조회가 되지 않으면, 발급 신청서 작성 불가)
그리하여 구매하거나 얻은 도메인을 연결하는 것부터 진행해보겠습니다.
AWS Routing 53 과 ACM 을 이용하면 쉽게 할 수 있지만, 사용하지 않고 해보기로 하였습니다.
도메인 연결

여러 도메인 업체가 있지만 저는 무료로 도메인을 제공해주는 “내 도메인 한국”을 이용하였습니다..

일반 도메인에 원하는 도메인 명을 입력하고 검색 버튼을 누른 후, 하단에 도메인 검색 결과 중 하나를 선택하여 등록하기 버튼을 누릅니다. 제가 heycake.kro.kr 를 이미 선택하여서 등록불가라고 뜨는 것을 볼 수 있습니다.

도메인 발급이 완료되면 EC2 서버와 연결해야합니다. IP연결 체크박스를 누르고 EC2 퍼블릭 ip 를 입력하고 수정하기를 누릅니다.

현재 8080 포트를 붙여야만 접속이 가능하기에 번거롭습니다. 따라서 외부에서 80번 포트로 요청이 오면, 리눅스 단에서 8080번 포트로 포워딩하여 연결해주겠습니다.
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080
EC2 에서 위 두 명령어를 치면 됩니다.
명령어는 80포트로 들어온 요청을 8080으로 포워딩하겠다는 의미입니다.
이후에 EC2 의 보안그룹에서 80포트를 열어주고 기존에 8080 으로 열어둔 2개의 규칙을 삭제하였습니다. 아래에서 8080을 제거하고 접속하여도 잘 진행되는 것을 볼 수 있습니다.

HTTPS 설정
Nginx 이용
Nginx 를 사용할 것입니다. Nginx는 웹 서버 중 하나로 WAS 앞단에 위치합니다. 해줄 수 있는 역할로 로드밸런싱, 포트 포워딩, SSL 설정 등이 있습니다. 저는 Nginx를 활용하여 SSL 설정을 해 보겠습니다.
sudo apt-get install -y nginx nginx-common nginx-full
위 명령어로 EC2 에 Nginx 를 설치합니다.
Nginx 를 설치한 김에 위에서 포트 포워딩한 것을 Nginx 단에서 해보도록 변경해봅시다.
sudo iptables -t nat -L --line-numbers sudo iptables -t nat -D PREROUTING 1
첫번째 명령어로 8080 으로 포트포워딩 해줬던 정책의 번호를 확인하고, 저의 경우는 1번이었기에 삭제해줬습니다.
sudo vi /etc/nginx/nginx.conf
user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events {} http { upstream app { server 127.0.0.1:8080; } server { # 80번으로 요청이 오면, localhost의 8080번 포트로 연결해 준다는 의미입니다. listen 80; location / { proxy_pass <http://app>; } } }
nginx.conf 로 가서 위와 같이 수정해줍니다.
sudo service nginx restart
Nginx 를 재시작해주고 다시 접속해봅니다.

성공적으로 포워딩된 것을 볼 수 있습니다.
SSL 설정
HTTPS 프로토콜은 SSL 로 암호화한 HTTP 입니다.
그러므로 SSL 인증서를 받아봅시다.
sudo apt-get update -y sudo apt-get install software-properties-common -y sudo apt-get install certbot -y
SSL 을 발행할 수 있는 cerbot 을 다운받습니다.
sudo certbot certonly -d heycake.kro.kr --manual --preferred-challenges dns
SSL 을 받기 위해 위와 같은 명령어를 입력합니다. heycake.kro.kr 자리에 자신의 도메인 이름이 들어가면 됩니다.

자신의 이메일을 적고 Y 를 쳐서 약관에 동의합니다.

_acme-challenge 는 호스트 값이고 _iFH1J5XAEIerLEA78xKEIykYSBmVqAPeAIc--cV5JA 가 DNS TXT 레코드 값입니다.

“내 도메인 한국” 의 도메인 관리로 들어가서 위 값들을 입력해줍니다.
입력해준 후 EC2 서버에서 일정 시간 지나고 엔터를 치라고 나옵니다. 저는 1분정도 뒤에 엔터를 쳐주니 아래와 같이 성공했다는 메세지가 나왔습니다.

SSL 인증서를 성공적으로 발급받았습니다.
이제 Nginx 에 설정을 해주도록 합시다.
sudo vi /etc/nginx/nginx.conf
nginx.conf 를 열어서 아래와 같이 입력합니다.
user www-data; worker_processes auto; pid /run/nginx.pid; include /etc/nginx/modules-enabled/*.conf; events {} http { upstream app { server 127.0.0.1:8080; } underscores_in_headers on; # Redirect all traffic to HTTPS server { listen 80; return 301 https://$host$request_uri; } server { listen 443 ssl; ssl_certificate /etc/letsencrypt/live/heycake.kro.kr/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/heycake.kro.kr/privkey.pem; # Disable SSL ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # 통신과정에서 사용할 암호화 알고리즘 ssl_prefer_server_ciphers on; ssl_ciphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:DH+3DES:!ADH:!AECDH:!MD5; # Enable HSTS # client의 browser에게 http로 어떠한 것도 load 하지 말라고 규제합니다. # 이를 통해 http에서 https로 redirect 되는 request를 minimize 할 수 있습니다. add_header Strict-Transport-Security "max-age=31536000" always; # SSL sessions ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; location / { proxy_pass http://app; } } }
중간에 heycake.kro.kr 자리에 본인 도메인으로 바꿔서 입력하면 됩니다.
그 후, EC2 보안그룹으로 들어가서 HTTPS 의 기본 포트인 443 포트를 열어줍니다.
Nginx 를 재시작해줍니다.
sudo service nginx restart
그 후, 다시 들어가보면 https 가 적용된 것을 확인할 수 있습니다.

http로 요청을 보내도 자동으로 https로 변경되어 요청이 가는 것을 확인할 수있습니다.
요청이 스프링까지 오기 전에 Nginx 에서 80번 포트를 443번 포트로 포워딩을 하고, 443번 포트에 대해 SSL 프로토콜을 적용하였기 때문입니다.
인증서 자동 갱신
Let’s encrypt 는 3개월마다 만료되기에 갱신을 해주어야합니다.
linux의 crontab 명령어를 사용하여 자동으로 인증서를 갱신해봅시다.
crontab 설정 파일을 엽니다.
sudo vi /etc/crontab

맨 아랫줄에 다음 명령어를 적어줍니다.
15 3 * * * certbot renew --quiet --renew-hook "/etc/init.d/nginx reload"
3개월마다 인증서를 자동갱신한다는 의미입니다.
출처
https://bbeomgeun.tistory.com/73
https://catalina.tistory.com/17
https://steady-coding.tistory.com/628
'개발' 카테고리의 다른 글
@Modifying 의 flushAutomatically 속성을 명시해야 하는 이유 (0) | 2023.04.09 |
---|---|
스케줄링, 배치로 S3 이미지 삭제 처리 (0) | 2023.04.05 |
AWS S3 에서 이미지를 관리해보자 (0) | 2023.03.27 |
@TransactionalEventListener 파헤치기 (0) | 2023.03.02 |
Facade 레이어를 도입해보자 (0) | 2023.02.19 |