본문 바로가기

소소한 꿀팁..?

aws ec2(ami)의 nginx에 SSL인증서 받아서 https 통신하기

현상

certbot을 사용하기 위해 epel-release를 하였지만 해당 패키지를 yum에서 찾지 못했다고 나왔다.

yum의 동작방식은 다음과 같다.

  1. 정확한 패키지가 로컬yum 저장소에 이미 존재한다면 인터넷 연결 없이 바로 해당 패키지를 설지할 수 있다.
  2. 만약 패키지의 의존성이 다른 패키지에 의해 충족되어야 한다면 필요한 모든 의존 패키지를 인터넷를 통해서 다운로드 한다.

요약하면 현재 나의 서버에 존재하는 yum 저장소에는 epel-release 패키지가 존재하지 않는다.

그렇기 때문에 에러가 난 것이다.

 

고치는 법

이를 해결하기 위해서는 epel-release가 있는 yum저장소를 나의 로컬 서버에 추가해주고 이를 설치하면 된다.

결론을 말하면 아마존(AMI3)의 보안정책이 바뀌면서 amazone linux에서는 certbot만 설치 하지 못하고 nginx를 이용해서 설치해야 한다.

➕ SSL/TLS 인증서를 받기 위해서는 도메인 이름이 필요하다. 도메인 이름은 가비아와 같은 곳에서 구매할 수 있다.

이렇게 하면 기존 아키텍쳐 구조가 바뀌게 된다.

기존 아키텍쳐
수정된 아키텍쳐, 인증 서버 역할을 하는 nginx를 스프링 부트 앞단에 둔다.

1. pip를 이용해서 python3 패키지를 직접 설치하고 가상환경을 설정한다.

# pip를 이용하여 python3 패키지를 직접 설치한다. 
sudo dnf install -y python3 augeas-libs pip 

# Python의 가상환경을 설정한다. 
sudo python3 -m venv /opt/certbot/

2. nginx를 설치한다.

# nginx 설치 
sudo yum install nginx

 

3 nginx를 다음과 같이 설정한다.

sudo su -
# 패키지 관리자를 사용하여 Python3와 augeas-libs 패키지를 설치한다.
dnf install python3 augeas-libs

# 기존에 설치되어있는 certbot을 제거한다.
dnf remove certbot

# 파이썬 가상환경을 생성한다.
python3 -m venv /opt/certbot/

# 생성한 가상환경의 pip를 업그레이드 한다.
/opt/certbot/bin/pip install --upgrade pip

# Certbot과 Certbot Nginx 플러그인 을 가상환경에 설치한다.
/opt/certbot/bin/pip install certbot certbot-nginx

# 실행 파일에 대한 심볼릭 링크를 생성하여 Certbot을 시스템 전역에서 실행할 수 있게 한다.
ln -s /opt/certbot/bin/certbot /usr/bin/certbot

# certbot을 이용해서 nginx에 SSL 인증서를 적용한다.
certbot --nginx

# nginx 서비스를 재시작한다.
systemctl restart nginx

 

4. nginx 설치 이후 /etc/nginx/conf.ddefault.conf라는 파일을 만들어 아래의 코드를 작성해준다.

server {
    listen 80;
		# 구입한 도메인 이름을 기입한다. ex) www.localstorybe.site
    server_name your.domain.com;

    location / {
				# 비즈니스 로직이 동작하는 서버의 ip를 작성해준다.
        proxy_pass http://192.168.XXX.XXX;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}

여기까지가 도메인과 IP(nginx가 아닌 스프링부트가 동작하는 서버의 ip)를 연결해주는 작업이다. 아래부터는 certbot을 통한 SSL인증을 설정하는 방법이다.

 

5. 다음 명령어를 실행해 SSL 인증서를 발급받으면 된다.

certbot --nginx

그리고 이메일을 입력하고 이용약관에 동의 후 사용할 도메인을 입력하면 된다.

다음과 같이 나오면 SSL 인증을 성공한 것이다.

이 과정을 거치면 Certbot은 Let's Encrypt를 통해 자동으로 SSL 인증서를 발급해온다.

 

➕추가

그리고 아까 만들어 두었던 /etc/nginx/conf.ddefault.conf라는 파일을 확인하면 certbot이 HTTPS를 위해 추가 해놓은 여러 설정들을 확인 할 수 있다.

SSL인증을 받기 이전과 달리 무언가 추가된 것을 확인할 수 있다.

그리고 SSL인증서는 90일이 지나면 만료가 되기 때문에 재발급을 해주어야 한다. 그리고 리눅스의 crontab으로 이를 자동화 할 수 있다

1. cron job 생성하기

crontab -e

2. 다음과 같이 코드를 작성해준다. 여기서는 매월, 매일 0시 0분에 certbot을 실행하여 SSL 인증서를 갱신하고, 갱신 이후 nginx의 설정파일을 reload 해주는 작업이라고 명시해주었다.

0 0 * * * certbot renew --post-hook "sudo service nginx reload"

 

➕ 만약 cron 명령어를 찾을 수 없다고 나오면 아래의 글을 확인해보자

더보기
명령어를 찾을 수 없다고 나온다.

1. 아래 명령어를 작성해 현재 crontab이 설치되어 있지 않은 것을 확인한다.

which crontab

 2. cronie를 설치한다.

cronie를 설치한다.

3. crontab이 올바르게 설치되었는지 확인한다

which crontab

4. crontab을 path에 넣는다.

export PATH=$PATH:/usr/sbin

5. profile을 다시 불러온다.

profile을 다시 불러온다.

6. crontab이 올바르게 설치되었는지 확인한다.

which crontab