본문 바로가기
프로젝트/라즈베리

[4] Nginx에 HTTPS/SSL 적용하기

by Riverandeye 2020. 9. 8.

해당 게시글은 이전 게시글과 이어지는 글입니다. 

 

현재 구성된 파일 서버는 http 프로토콜을 이용한다. 사용하다 보면 다음과 같이 주소창에 주의 요함 표시를 확인할 수 있다 .

 

뭘 주의하라는거지?

클릭해보면 HTTPS 프로토콜이 사용되지 않았음을 알 수 있다. 

 

HTTPS 를 쓰지 않은 걸 주의하라는건가?

 

HTTP 프로토콜은 전송되는 정보에 대한 암호화가 이루어지지 않고, HTTP 메시지에 평문으로 전달되기 때문에 유출의 위험이 있다. 

HTTPS 는 HTTP 프로토콜에 SSL/TLS 암호화를 추가하여 메세지를 암호화 및 복호화 한다. 

 

1. Let's Encrypt 에서 인증서 발급받기.

 

HTTPS 프로토콜을 사용하기 위해선 인증서가 필요하다. (엄밀히 말하면, SSL/TLS 프로토콜 영역에서 필요하다) 

브라우저에는 여러 인증 기관들의 공개키를 포함한 Root CA 기관들의 인증서들이 설치되어 있어, 해당 인증서의 하위 기관에서 발급한 인증서가 아닌 경우엔 올바르지 않은 인증서라고 뜰 것이다. 

그런 인증 기관 중 무료로 개별 사용자가 인증서를 발급 받을 수 있는 기관중 하나가 Let's Encrypt 이다. Let's Encrypt 에서 제공하는 인증서를 이용해 Https 를 사용해보자. 

 

이건 Ubuntu 에서 적용하는 명령어이다. 

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update

간단하게 명령어를 설명하면

sudo apt-get update 는 현재 설정되어 있는 apt repository 들의 패키지 정보를 업데이트하며, 기존에 설치되어 있는 패키지의 Dependency를 업데이트해준다. 

sudo apt-get install software-properties-common 은 PPA를 관리해주는 도구를 설치하는 것인데, PPA란 Personal Package Archive의 줄임말로 개인 패키지 아카이브이다. 

그 후 명령어는 software-properties-common 에 의해 설치된 add-apt-repository 명령어로 universe 와 ppa:certbot/certbot 레포지토리를 가져온 것이다. universe에 대해 알고싶다면 이 글을 참고하자. 

해당 레포지토리를 추가했으므로 update를 통해 패키지 정보를 업데이트한다. 

 

certbot ppa에서 패키지를 가져오기 위해서 저런 과정을 거치는 것인데, 라즈비안에서는 그냥 설치하면 된다. (?)

sudo apt-get install certbot -y

그 후 인증서를 발급 받기 위해 다음 명령어를 친다. 

sudo certbot certonly --standalone

certonly 라는 옵션이 있는 만큼, 인증서 발급 외의 다른 기능을 해주는 옵션도 있는데, 거기까진 다루지 말고 우선 인증서 발급부터 해보자. 

--standalone과 --webroot 옵션 두가지가 있는데, --standalone은 인증서 발급 프로세스를 위해 80번 포트를 잠시 사용한다. 

80번 포트를 이용하여 https 리다이렉트를 구성하고 있는 경우 --standalone 옵션을 사용하게 되면 현재 구성하고 있는 프로세스를 종료하여야 한다. nginx를 켜놨다면 sudo nginx -s stop 명령어로 잠시 멈춰보자. 

 

해당 명령어를 처음 실행하면 이메일을 입력하고 LetsEncrypt 메일 받아보고.. 등등.. 이야기가 있다. 

그런거 다 제쳐두고 도메인 이름을 작성하면 바로 생성된다. (매우 간단)

물론 현재 서버가 해당 도메인에 연결되어있는 상태여야 가능하다. (Route 53 과 같은 DNS 호스팅 서비스를 이용하자)

 

인증서를 생성했으면, 경로가 작성되어 나타날 것이다. 일반적인 경로는 /etc/letsencrypt/live/$domain.name 이고 해당 폴더에 있는 privkey.pem 과 fullchain.pem 을 사용한다. 이 링크는 Symbolic link 이고, 실제 파일은 다른 곳에 위치해있다 (그 파일이 원본). 이렇게 하는 이유는 인증서의 기한이 만료되었을 때 편리하게 업데이트 하기 위함이다. 

 

2. Nginx에 SSL/TLS 적용하기

 

인증서를 발급 받았으면, 도메인 이름에 해당하는 sites-available 폴더의 설정 파일을 찾아 고쳐야 한다. 

우선, 기존에 80번으로 서버를 띄웠는데, 80번은 HTTP 프로토콜로 지정되어 있다. 

HTTPS는 443번 포트이고, 우리 서비스를 항상 HTTPS로 서비스하기로 결정하였기 때문에

80번으로 들어온 요청을 모두 443으로, 즉 HTTPS로 요청하게끔 리다이렉트 해야한다. 

 

이를 위해 기존 설정을 모두 제거하고, 80번으로 요청시 리다이렉트 하는 구문을 구성한다. 

server {
	listen 80;
        server_name <도메인 이름>;
        return 301 https://$server_name$request_uri;
}

cloud.riverandeye.com 도메인을 소유한 경우 다음과 같이 작성하면 된다.

 

그 다음, 443 포트로 서버를 열고 ssl/tls 설정을 추가해야 한다. 

 

443 포트를 listen 하며 http2 모듈을 적용한다.

server_name은 본인 도메인을 지정하고

certificate과 Key는 개별적으로 지정한 도메인으로 생성된 경로의 fullchain.pem과 privkey.pem을 이용한다. 

그 밑에는 이전 것과 동일하게 사용한다. 

 

다음과 같이 설정하고 nginx를 재실행한 후, 만든 서비스에 접속하면 다음과 같이 자물쇠가 걸려있는 것을 볼 수 있다. 

 

현재 구성한 설정들은 빙산의 일각이고

꼭 nginx가 아니더라도 인증서는 공통으로 적용되는 부분이기 때문에, 이에 대해 좀 더 깊은 이해가 필요한 것으로 보인다. 

댓글