Let's Encrypt를 이용하여 Nginx에 HTTPS 적용하기

콜트·2021년 1월 9일
1

라이징 프로그래머2

목록 보기
10/18
post-thumbnail

들어가기 앞서..

먼저, 본 과정을 진행하려면 전제조건이 필요하다.

  • Ubuntu 16.04 서버 1개(버전에 따라 대동소이할 것이다. 참고자료를 살펴보자).
  • 완전히 등록 된 도메인 이름(본인의 경우에는 가비아에서 구매한 도메인을 사용하였다).
  • 서버에 대해 다음과 같이 설정된 DNS 레코드.
    • example.com이라는 서버의 공용 IP 주소를 가리키는 A 레코드.
    • 서버의 공용 IP 주소를 가리키는 A 레코드(www.example.com).

1. certbot 설치

  1. Let's Encrypt를 사용하여 SSL 인증서를 얻는 첫 번째 단계는 서버에 Certbot 소프트웨어를 설치하는 것이다. Certbot는 최신 버전의 Ubuntu 소프트웨어 저장소를 유지하므로 해당 저장소를 사용한다. 먼저 업데이트를 하자.

  2. 다음으로 저장소를 추가해준다.

  3. 다시 업데이트를 한 뒤, CertbotNginx 패키지를 설치한다.

이렇게 하면 Certbot은 이제 사용할 준비가 되었지만 NginxSSL을 구성하려면 Nginx의 구성 중 일부를 확인해야 한다.

2. Nginx 설정

  1. Nginx 기본 구성 파일을 업데이트하기 위해 vi 편집기로 열어준다.

  2. 기존 server_name 부분의 밑줄(_)을 인증서를 적용할 도메인 이름으로 바꿔준뒤, 파일을 저장한다.

  3. 다음으로는 변경된 구성(설정)이 잘 적용되는지 테스트를 진행한다.

  4. 테스트가 별 문제없이 잘 되었다면 설정 파일을 적용하기 위해 Nginx를 다시 로드하여 변경된 설정을 적용한다.

3. 방화벽을 통한 HTTPS 허용

이 부분에 있어서, AWS EC2 인스턴스를 사용하였기 때문에 참고자료와는 다소 다르다. 기본적으로 Ubuntuufw라는 기본적인 방화벽을 가지고 있다. 하지만 다음 사진과 같이 확인해보면 Status: inactive라고 나온다. 즉, 활성화되어 있지 않다는 뜻이다. 그러므로 참고자료에서의 이 단계는 생략할 수 있다. 하지만 AWS EC2 인스턴스에서는 보안 그룹 설정을 따로 해주어야 한다. 이는 다음 단계에서 다루도록 하겠다. 기본적으로 SSL 프로토콜은 443 포트 번호를 사용한다고만 알고있도록 하자.

만약 AWS EC2 인스턴스를 사용하는 것이 아니고, ufw가 활성화되어 있다면 참고자료의 3단계 - 방화벽을 통한 HTTPS 허용 부분을 참고해서 진행하도록 한다.

4. SSL 인증서 받기

Certbot은 다양한 플러그인을 통해 SSL 인증서를 획득하는 다양한 방법을 제공한다. Nginx 플러그인은 필요할 때마다 Nginx를 재구성하고 구성을 다시 로드한다.

  1. 먼저, sudo certbot --nginx -d example.com -d www.example.com라는 명령어를 실행하여 example.com, www.example.com과 같이 원하는 도메인을 지정해서 Nginx 플러그인을 통해 인증서를 획득할 수 있다(필자는 삽질한다고 이미 한번 과정을 진행했다가 다시 해당 명령어를 실행시켰기 때문에 화면이 조금 다르지만 약간의 변경일 뿐이다. 처음 위 명령어를 실행하면 이메일 등록과 약관 동의 화면이 나온다). 만약 도메인을 더 추가하고 싶다면 -d 옵션을 주고 더 추가하면 된다(물론 설정 파일에 server_name 부분을 변경한 부분에도 추가되어 있어야 한다). 그런데 아래를 보면 에러가 발생했다고 나온다. 이는 위에 지정한 도메인중 rp2-colt.shop 라는 도메인이 등록되지 않았기 때문에 나오는 오류이다.

  2. 따라서 위의 오류를 해결하기 위해 가비아에 도메인 레코드를 추가해줬다.

  3. 처음 인증서 설치를 진행하면 다음과 같이 이메일 등록과 약관 동의를 거치고나면 기존 HTTP 연결을 어떻게 설정할 건인가에 대한 질문이 나타나는데 목록은 다음과 같다(아래의 1, 2 선택지가 보이는가?).
    - 1을 입력한다면 HTTP 연결을 HTTPS로 리다이렉트 하지 않습니다.
    - 2를 입력한다면 HTTP 연결을 HTTPS로 리다이렉트 합니다.
    1 또는 2를 입력하고 엔터를 누르면, 구성이 업데이트 되고 Nginx 서버가 재시작된다.

  4. 필자는 2를 입력하여 모든 HTTP 연결을 HTTPS로 리다이렉트 하는 설정을 선택했다. 필요에 따라 선택해주자. 그리고 기다리면 다음과 같이 인증서 다운로드 및 설치되었다고 나온다.

  5. 눈썰미가 있으신 분은 보셨을 수도 있는데, 4. 단계에서 You should test your configuration at:이라는 문구가 있고, 그 다음에 오는 url이 있다. 이 url은 해당 도메인에 대한 서버를 테스트할 수 있는 url이다. SSL Labs Server Test로 이동해서 다음과 같이 테스트할 도메인을 입력해준 뒤 테스트를 진행한다.

  6. 근데 오류가 난다. 왜? 이는 앞 단계에서 언급했던 방화벽과 관련된 문제로, AWS EC2 인스턴스보안 그룹SSL이 사용되는 443 포트 번호를 열어주지 않았기 때문이다.

  7. 따라서 다음과 같이 추가해준다.

  8. 이제 다시 앞전의 단계를 거치면 다음과 같이 테스트된 화면에서 등급을 확인할 수 있다.

5. Certbot 자동 갱신 확인

Let's Encrypt의 인증서는 90일 동안만 유효하므로, 90일마다 갱신해줘야 한다. 하지만 설치를 하는 과정에서, /etc/cron.d에 자동으로 갱신 시켜주는 커맨드가 추가되어 있다. 다만, 갱신 프로세스가 잘 동작하는지 테스트를 해보고 싶다면 다음과 같은 명령어를 입력해서 테스트를 진행할 수 있다.

따로 오류가 표시되지 않으면 모든 설정이 완료된 것이다. 필요한 경우 Certbot은 인증서를 갱신하고 Nginx를 다시 로드하여 변경 사항을 적용한다. 만약 자동 갱신 프로세스가 실패할 경우 Let's Encrypt는 지정한 이메일로 인증서가 만료될 때 경고 메시지를 보내준다.


참고자료


profile
개발 블로그이지만 꼭 개발 이야기만 쓰라는 법은 없으니, 그냥 쓰고 싶은 내용이면 뭐든 쓰려고 합니다. 코드는 깃허브에다 작성할 수도 있으니까요.

0개의 댓글