[https] Certbot을 활용한 HTTPS 적용과 리다이렉트(ubuntu-nginx)

  1. Ubuntu OS 기반 Nginx 웹 서버에 certbot 을 활용하여 https를 적용시킨다.
  2. http 접속을 https 로 리다이렉트한다.

Certbot을 설치하기 전에

Certbot 을 설치하는 방법은 다양하지만, 현재 Let`s encrypt 1 의 공식입장은 snap 패키지2를 활용해서 설치하는 방법이다. 참고로 Shell 명령어인 certbot-auto 를 활용한 방법은 더 이상 지원하지 않고 있으며, 삭제를 권하고 있다.

snap 패키지를 사용하므로 ubuntu 16.04 이상 버전이여야 한다.

혹여나 다른 OS와 다른 웹서버에서 설치하고 싶다면 여기를 통해 원하는 OS와 웹서버를 선택하면 Let`s encrypt 가 권장하는 공식 설치 방법을 알 수 있다. 영어 주의

Certbot 설치는 공식문서의 방법을 그대로 인용한 것으로, 원본은 여기서 확인할 수 있다.

참고로 HTTPS는 도메인을 통해서 적용시키므로 IP로만 접속할 수 있다면 해당 IP에 도메인을 연결해야한다.


Certbot 설치

sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot

sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo certbot --nginx

sudo certbot --nginx 를 입력하면 다음과 같은 질문들이 나온다.

124739318-b1e8c100-df54-11eb-94a9-d4f883디버깅을 위한 로그, 긴급한 사항 혹은 보안 사항 등을 전달할 이메일을 입력해달라는 내용, 이메일을 입력한 후 엔터

124739581-f5432f80-df54-11eb-8bb6-98be7a약관을 읽고 SSL 을 사용하기 위한 서버 등록을 승낙해야 한다는 이야기. Y 입력한 후 엔터

124740075-6551b580-df55-11eb-8ebc-e5bb1f위에서 입력했던 이메일을 재단에도 공유해서 재단의 뉴스, 캠페인, 디지털 자유운동 지원 방법 등을 받을 것인지에 대한 내용. 흔히들 생각하는 NGO단체의 이메일이라 생각하면 될 것 같다.

난 오픈소스의 힘을 믿으니까 Y



124740976-3ab42c80-df56-11eb-8ec5-7524f6어떤 도메인에 HTTPS를 적용시킬지 물어본다. 그냥 엔터를 누르면 목록에 뜬 모든 도메인에 HTTPS를 적용시켜주고, `1 3` 이런식으로 숫자를 띄어서 엔터를 누르면 해당 도메인만 HTTPS를 적용시켜 준다.

난 모든 도메인을 HTTPS 적용시키길 원하니 그냥 엔터



124741806-11e06700-df57-11eb-8b99-815c48Successfully deployed certificate for 도메인 과 함께, 어떤 도메인들이 HTTPS가 적용됐는지 알려주고 만약 마음에 든다면 기부를 권하는 모습이다.

역시 NGO계열은 다들 비슷비슷한가보다.

이 방법을 따라왔다면 기본 옵션을 수정하지 않는 한, certbot 은 만료 전에 자동으로 갱신되며 리다이렉트까지 자동으로 설정되어 있다.




리뉴얼이 되는 모습을 확인해보고 싶다면

sudo certbot renew --dry-run을 사용하면 되고 다음과 같이 나오게 된다.
124742554-ce3a2d00-df57-11eb-8ca4-9677d6

sudo service nginx restart 로 웹서버를 재시작을 해주고 해당 도메인을 들어가면 https로 연결되는 것을 알 수 있다.


HTTP를 HTTPS로 리다이렉트

물론 위에서 밝혔듯, 친절한 snap 패키지의 certbot 설치는 리다이렉트까지 지원하지만, 그대로 두면 Safari 에서는 리다이렉트를 안하게 되어, 수정할 필요가 있다.

sudo vi /etc/nginx/sites-available/default 로 nginx 옵션에 들어가자.

... 코드들 ...

server {
    if ($host = 도메인) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = 도메인) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    if ($host = 도메인) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


        listen 80;
        listen [::]:80;
        server_name 도메인, 도메인, 도메인;
        return 301 https://도메인; # managed by Certbot 
        
        // 403 으로 되어있을 부분을 301 https://도메인 으로 바꿔준다.
}

default 에서 가장 밑에 있을 해당 server 블록에서, 가장 마지막 return 403 부분을 301 https://도메인 으로 바꿔준다. 이를 통해 서버가 80번(http)을 listen 하면 자동으로 https 로 리다이렉트 시켜준다. 부가적으로 listen 443 ssl  default_server를 추가시켜주어서 443포트가 이 서버의 기본 포트라는 걸 알려주는 것도 괜찮다.

여기서 301은 HTTP Status Code로, 영구 이동(Permanently moved)을 의미한다. 즉, "네가 요청한 페이지가 영구히 이전되었으므로 이 주소로 다시 접속을 시도해 봐라."라는 의미이다.3

여기서 실수하면 리다이렉트 횟수가 너무 많다는 등의 오류를 보게 된다. 혹시 리다이렉트 관련 오류가 생긴다면 return 되는 주소가 A가 A를 부르는 형태라든지 등을 확인하면 된다. 즉 리다이렉트 관련 오류는 왠만하면 설정자 잘못이다.

만약 리다이렉트 문제나 여타 관련 문제를 겪는다면 다른 브라우저 (Safari라면 크롬, Edge 등)도 사용해보고, 이곳에서 자신의 도메인이 제대로 연결은 되었는지 확인해보자. 브라우저의 쿠키 문제로 안될 수도 있으며, 도메인 자체가 제대로 연결되어 있지 않다면 당연히 문제가 생긴다.


Qualys. 에서 해당 도메인의 SSL이 얼만큼 강한 보안을 갖고 있는지 확인할 수 있다.

참고로 네이버가 B이다.
어?


출처
Certbot instruction 출처
Nginx에서 자동 Redirection(301 Permanently moved) 설정하기 출처
Let's Encrypt 위키백과 출처
*HTML에서 각주 사용하는 법 출처


1: Certbot 를 제공하는 프로젝트 명으로, 공익기관 ISRG(Internet Security Research Group) 가 주도하고 있다. firefox 를 만든 모질라재단, 스탠포드 법학대학원, 리눅스 재단이 지원하고 있다. 위키 출처

2: 우분투 16.04 버전부터 도입한 애플리케이션 패키지 포맷이다. 스냅으로 만들어진 애플리케이션은 내부에 구동을 위한 요소를 포함하고 있어 OS에 덜 의존하게 되며 프로그램에 필요한 모든 라이브러리가 포함되어 빌드되는 형태이다. 즉 express 를 스냅으로 설치한다면 node js 가 함께 설치..되나? 댓글로 알려줘요.. 출처

3: Nginx에서 자동 Redirection(301 Permanently moved) 설정하기

0
0
이 글을 페이스북으로 퍼가기 이 글을 트위터로 퍼가기 이 글을 카카오스토리로 퍼가기 이 글을 밴드로 퍼가기
captcha
자동등록방지 숫자입력

웹개발

번호 제목 글쓴이 날짜 조회수
102 [Git] git switch branch명 결과를 ftp로 업로드 하려면 최고관리자 06-02 10,016
101 [Git] git switch branch명 에서 바뀐파일(modifed File) 확인 최고관리자 06-02 4,500
100 [MySql] 테이블 내용 복사하기(인덱스 키 추가하기) 최고관리자 05-24 2,570
99 [Android] 안드로이드에서 PDF 미리보기가 안되는 이유 최고관리자 04-28 3,349
98 [PHPOffice] PHP 8.0 에서 PHPOffice 엑셀저장이 안되는 경우 최고관리자 04-26 1,641
97 [Javascript] window.location Value 최고관리자 04-18 1,581
96 [Git] git clone 과 git pull 의 차이점 최고관리자 04-14 1,301
95 [Git] 특정폴더만 pull 하기 최고관리자 04-14 1,313
94 [Upload] Nginx + PHP7.4 Upload 설정 최고관리자 04-10 1,195
93 [https] Certbot을 활용한 HTTPS 적용과 리다이렉트(ubuntu-nginx) 최고관리자 04-02 9,457
92 [Linux] Bash 명령어 활용 최고관리자 03-26 1,576
91 [MySQL] 중복 데이타 삭제하기 최고관리자 03-16 2,343
90 [Git] 중앙 원격 저장소, 자신의 원격 저장소, 로컬 저장소의 개념 최고관리자 03-01 1,410
89 [GitHub] Git 브랜치의 종류 및 사용법 (5가지) 최고관리자 03-01 1,359
88 Git 한글 메뉴얼 최고관리자 02-25 1,275
87 ERROR 1698 : Access denied for user 'root'@'localhost' 문제 해결 최고관리자 02-24 1,310
86 NGINX + PHP71 + PHP-FPM 설치하기 최고관리자 02-23 1,192
85 (function() { })() 의 의미는? 최고관리자 02-16 1,297
84 [참고] 부트스트랩(bootstrap) 사이트 개발 최고관리자 10-09 1,621
83 [JS] 디바운스(Debounce)와 스로틀(Throttle ) 그리고 차이점 최고관리자 09-14 1,822