요 며칠동안 꼬여있던 SSL 설정을 해결해보려고 삽질을 했습니다. 아마존 라이트세일 로드밸런서를 사용해도 인증서 발급만 자동으로 해줄뿐, 아파치 서버 설정까지 만져주는것은 아니더군요. 그래서 결국 직접 전부 세팅하게 되었는데, 차후에 또 생길지 모를 일이니 기록하고자 합니다.

작업의 목적은 포트폴리오 사이트, 블로그, 새로만들 포럼 사이트를 각각 virtualhost로 지정해주고, SSL까지 적용하는 것입니다. 작업의 흐름은 아래와 같습니다.

  1. VirtualHost 80 적용.
  2. SSL 인증서 발급
  3. crontab을 이용한 자동 갱신 적용
  4. VirtualHost 443 적용
  5. http 접속을 https로 강제 리다이렉트 redirect
  6. the requested url was not found on this server 에러 발생 해결

 

1.VirtualHost 80 포트 적용

기본적으로 아마존 라이트세일에서 bitnami wordpress로 설치했다면, /opt/bitnami/apache2/conf/extra/httpd-vhosts.conf 파일을 통해서 virtualhost 적용을 하는 것이 편리합니다. 물론 /opt/bitnami/apache2/conf/httpd.conf에서 include /opt/bitnami/apache2/extra/httpd-vhosts.conf에 대한 주석을 제거해서 적용할 수 있도록 먼저 설정해줘야합니다. 아래 내용은 마지막에 또 다시 변경해줘야하므로, 중간과정으로 이해하길 바랍니다.

80포트로 접속했을 경우를 설정해주고 sudo /opt/bitnami/ctlscript.sh restart apache 명령으로 변경된 설정을 적용해줍니다.

2.Certbot-auto를 이용해서 SSL인증서 발급

sudo mkdir /opt/bitnami/letsencrypt 명령을 이용해서 폴더를 생성한 다음 그 곳( cd /opt/bitnami/letsencrypt )에서 아래 명령을 통해 certbot-auto를 다운로드 받고, 파일 권한을 변경해줍니다.

그다음 아래 명령으로 인증서를 발급받습니다. 저같은 경우엔 illustudio.co.kr / blog.illustudio.co.kr / forum.illustudio.co.kr 이렇게 세 차례에 걸쳐서 작업을 해줬습니다.

3.Crontab을 이용한 갱신 자동화

letsencrypt 인증서는 무료인 대신 90일마다 갱신을 해줘야합니다. 그래서 자동으로 갱신될 수 있도록 crontab 명령에 아래 내용을 추가합니다. 매월 초마다 새벽 3시마다 명령이 실행되고, 아파치가 재실행 됩니다. /opt/bitnami/letsencrypt라는 경로는 제가 certbot-auto를 설치한 경로이므로, 본인이 다른 경로에 설치했다면 맞는 경로로 변경해줘야합니다.

2018.8.4일 추가 – blog.illustudio.co.kr은 정상적으로 renew 명령이 작동합니다만, illustudio.co.kr 은 정상적으로 작동하지 않는 문제를 찾았습니다. 검색을 좀 해보니 http 프로토콜로 접속이 되야하는데 강제로 https로 리다이렉트 시켰기 때문에 생기는 문제인 것 같습니다. blog.illustudio.co.kr에도 적용된 사항인데, 유독 illustudio.co.kr만 되지 않는 것이 좀 의아하네요. 아무튼 이 부분은 일시적으로 https 리다이렉트 부분을 수정해서 아파치를 리부트 시킨 후 certbot-auto renew를 하니 정상적으로 갱신 되는 것이 확인됐습니다. 다시 해결책을 찾게 되면 추가 포스팅 하도록 하겠습니다.

4.VirtualHost 443 포트 적용

SSL 인증서 설치까지 완료 됐으니 HTTPS 프로토콜을 사용할 수 있도록 443 포트 설정을 해줘야합니다. 사실, 이 과정까지 오기전에 라이트세일 인스턴스에서 https 443 포트도 사용할 수 있도록 설정해주는 것이 좋습니다. 기본적으로 80, 22, 443, 3306 포트는 사용할 수 있도록 설정하는 것이 관리상 편리합니다. 443 포트에 대한 설정은 아래와 같습니다. 이 부분도 중간과정입니다.

기본적으로 illustudio.co.kr의 경우만 해놨습니다. 이전 과정으로 심볼릭 링크를 걸어주는 방법이 있는데, 사이트가 여러개일 경우엔 그 방법으로 컨트롤 하기 어렵다고 생각되서, 이렇게 바로 발급된 링크를 연결해줬습니다.

여기까지 하고 나면, http와 https 둘다 연결이 될 수 있도록 설정이 된 상태입니다. 하지만, https로 강제로 사용할 수 있도록 설정해주기로 했습니다.

5. http 접속을 https로 강제 리다이렉트 redirect

RewriteRule을 검색해서 HTTP_POST나 SERVER_NAME으로 설정하는 방법도 있지만, 그냥 무식하게 해당 도메인으로 바로 연결해버렸습니다. 사실 포폴 사이트, 블로그, 포럼 셋다 전부 저런식으로 각각 설정해줘야했기때문에 상관 없을 것 같습니다. 여기까지하면, http로 접속해도 자연스럽게 그냥 https 프로토콜로 접속이 되는 것을 확인할 수 있습니다. 80포트에 대한 virtualhost 설정은 이것이 최종 결과물입니다.

문제는 여기서 블로그나 포폴사이트 게시글을 클릭했을때 the requested url was not found on this server 에러가 발생하는것을 발견해서 그 부분을 해결해주는 내용이 필요했습니다.

6.the requested url was not found on this server 에러 발생 해결

게시글을 눌렀을때 the requested url was not found on this server 에러가 발생하는 것은 이런식으로 해결해주었습니다. 역시 구글의 도움을 많이 받았습니다. 일요일 오후부터 끙끙 매고 여기까지 오는데 3일 정도 걸린것 같습니다. 모든 문제가 정상적으로 해결되었습니다. 443포트에 대한 virtualhost 설정도 이것이 최종 결과물입니다.

 

포트폴리오 사이트를 전부터 오픈하려고 벼르고 별렀습니다. ‘중이 제 머리 못 깎는다’는 말처럼 자기 사이트를 만드는데 시간을 투자한다는게 참 쉽지 않더군요. 그래서 그냥 유료테마를 구입해서 커스터마이징 하기로 했습니다. 일단은 오픈부터 하고 봐야지 싶어서 말이죠. AWS 프리티어 기간이 3달정도 남긴 했는데, 기간이 임박해서 이전하다보면 왠지 또 뭔가 꼬일거 같다는 생각에 어제 다급하게 라이트세일 호스팅으로 옮겨탔습니다. 아직 한국 리전은 없고 가장 가까운 도쿄 리전으로 진행했는데 속도면에서 처진다는 느낌은 없어서 만족합니다.

다만 세팅할때 삽질을 많이 했습니다 ㅎㅎ  https://swiftcoding.org – 이 블로그 주인장분에게 무척 고마울 정도로 소상하게 많은 정보를 올려놓으셨더군요. 세팅하는데 참 큰 도움이 됐습니다. 삽질의 순간이 많긴 했지만, 그래도 어떻게 꾸역꾸역 해내고보니 새벽 늦은 시간이 되더군요. 결국 오후에 되서야 서버세팅과 SSL 세팅까지 마무리 지을 수 있었어요.

 

그런데 참 유료테마들도 아쉬운 구석이 많긴 하네요. 비주얼 컴포저 같은 사이트 빌더를 사용하면 일단 겉보기에 기능을 추가하는건 무척 쉽습니다만, 이래저래 손 봐줘야할 부분이 무척 많다는걸 느낍니다. 게다가 쓸데없이 태그의 계층이 깊게 파고 들어가 속도면에서 손실이 생기는 점도 있죠. 그래도 나름 SASS를 지원하는 테마더군요. 조금씩 시간들여서 커스터마이징 하면 어느정도 쓸만해질것 같아요.

그리고 나중에는 다시 underscore나 understrap으로 만들어서 써야지 싶습니다. 지금 운영하는 이 블로그 스킨도 막상 급하게 만들어서 쓰다보니 이래저래 손 봐야할 곳들도 많네요.

미처 스크린샷을 찍지 못했는데, 서버에 처음 접속하면 아래와 같이 업데이트 가능한 정보에 대해서 미리 알려줍니다. 정기적으로 업데이트 되는 내용들을 반영해주지 않으면, 보안과 관련해서 문제가 될 수 있으니 아래처럼 나오는 메세지를 잘 확인해줘야합니다.

문제는 위의 내용을 보고 보통 sudo apt-get update 와 sudo apt-get upgrade를 통해 업데이트 된 내용들을 적용해줍니다만, 제가 지금 겪은 에러는 sudo apt-get upgrade를 할때 “/usr/sbin/update-info-dir: 3: /etc/default/locale: //: Permission denied dpkg: error processing package install-info (–configure)” 이런식의 에러메세지를 뿜어내며 진행이 안되더군요. 최종적으로는 “E: Sub-process /usr/bin/dpkg returned an error code (1)” 나왔습니다만, 그 전에 installation-info에 문제가 있다는 에러메세지였습니다.

무슨 이유인지 아무리 뒤져도 나오지 않았습니다만, 한가지 껄끄러운 부분이 있었습니다. locale 설정과 관련해서 제가 default 상태가 아니라 한글로 변환해줬던 적이 있는데, 아마도 이게 문제가 되지 않나 싶더군요.

그래서 sudo nano /etc/default/locale 파일을 아래와 같이 다시 수정해주었습니다.

그리고 sudo update-locale 명령으로 변경된 내용을 적용을 해주고 나니, 다시 우분투가 영문으로 나오기 시작했고 sudo apt upgrade 명령도 정상적으로 수행하기 시작했습니다.

우분투 서버에서 워드프레스 사이트를 운영하면서 한글 주소를 사용하다보니 locale 설정도 변경해줘야하는 줄 알고 적용했던 부분인데, 사실상 우분투 ssh 접속시에 나오는 메세지 일부가 한글로 바뀐다는것 이외에 워드프레스 사이트에 영향을 주지는 않습니다. 알면서도 귀찮아서 그냥 놔뒀는데 이런식으로 업그레이드 상황에서 문제가 터질거라고 생각은 못했네요.

여튼 locale 설정을 바꿔줘서 문제는 해결이 됐습니다.

 

SSL 인증서 – 보안에 신경을 써보자

ssl

네이버에서도 보안이 중요하다고 여겨지는 페이지에는 https 프로토콜을 적용하고 있습니다.

SSL 인증이라는 것은 해당 인증이 적용된 사이트가 개인정보와 같이 민감한 내용들을 탈취 당하지 않도록 보호받고 있다는 이야기입니다. 이번에는 호스팅을 사용하던 때와 달리 아마존 웹 서비스로 옮기면서 서버를 직접 세팅할 수 있게 되었기때문에 SSL 인증서를 직접 설치해봤습니다.

특히나 쇼핑몰처럼 개인 정보를 다루는 곳에서는 SSL 인증서를 필수적으로 설치해야하는데요. 비용이 드는 유료 서비스와 공개적으로 무료 배포중인 서비스들이 있습니다. 유료냐 무료냐에 따라 특별히 성능 차이가 있는 것은 크게 없고, 무료 서비스의경우 3개월마다 새롭게 갱신해줘야하는 번거로움이 뒤따른다는 것이 유일한 단점입니다.

제가 SSL 인증서를 설치하면서 참고한 포스팅들은 아래와 같습니다. 이 곳에 기술된 내용들은 모두 아래의 사이트에서 참고하여 저의 환경에 맞춰서 조금씩 수정해서 작성되었습니다만, 좀 더 깊이 있는 이해를 위해서는 아래 사이트들을 참고하시길 바라겠습니다.

  • https://www.xpressengine.com/tip/23021383
  • http://stonerain.tistory.com/119
  • https://blog.lael.be/post/5107
  • https://blog.lael.be/post/73

그리고 이 사이트 – blog.illustudio.co.kr 이 운영되는 환경은 아래와 같습니다.

  • 우분투 리눅스 16.04.1
  • 아파치 2.4.18

1차적으로 해준 작업은 letsencrypt 설치입니다. 우분투 16.04 이상의 버전이라면 아래 명령어로 바로 설치가 가능합니다.

letsencrypt 설치가 끝나고나면 이제 인증서를 다운로드 받을 차례입니다. 아래 명령어를 입력해서 다운받고자하는 사이트를 명시해줘야합니다.

저의 경우엔 절대경로에 워드프레스가 설치되어있는 패스를 지정해주고, 도메인에는 현재 서비스되고있는 blog.illustudio.co.kr이라는 주소를 입력했습니다. 도메인별로 인증서를 따로 받아야하기때문에 -d 옵션을 반복적으로 넣으면서 여러개의 도메인 설치도 가능하다고 합니다만, 저의 경우엔 illustudio.co.kr도 같이 넣으니 에러가 발생해서 하나씩 진행하기로 했습니다.

이메일 주소를 입력받는 확인 창이 뜨고 난 뒤로는 정상 설치가 진행됐을 경우 안내 문구가 출력됩니다만, 에러가 발생하면 에러메세지에 따라 적절한 조치가 필요합니다.

아파치 서버 설정

그리고 https://blog.illustudio.co.kr 이라는 주소가 실질적으로 사용되기 위해 필요한 작업을 apache 설정 파일에서 명시해주도록 합니다. 아래 명령어를 통해 아파치 설정 파일을 열도록 합니다.

‘설정파일’이란 파일 이름은 상황에 따라 다르게 적용되야합니다. default를 그대로 쓰시는 분들도 있겠지만 저의 경우엔 blog로 따로 설정파일을 만들어서 관리해줬습니다. 그리고 아래 내용을 새롭게 추가했습니다.

HTTPS 프로토콜은 443 포트로 들어오기때문에 80번 포트로 들어올 경우 필요한 내용을 기술했더라도 443 포트로 들어올 경우에 어떻게 작동할 것인지 위에 기술한 소스 코드를 추가해주어야 됩니다. 그리고 아래의 명령어를 순서대로 입력해 SSL을 활성화시키고, 수정한 설정파일을 사용할 수 있도록 활성화시키고, 아파치 서버를 재시작해주면 됩니다.

그리고 추가적으로 서버상에서 443포트를 허용해주는 아래 명령어도 입력해줍니다.

위의 명령어를 입력하긴 했습니다만, 만약의 경우를 위해 저는 아마존 웹서비스 상에서 Security Groups 메뉴에서 https 443포트를 허용하는 규칙을 하나 더 추가했습니다.

SSL 적용 상태 확인 및  체크

SSL이 제대로 적용되고 있는지 체크하는 사이트를 통해 점검을 해봤습니다.

그 결과가 아래 스크린샷입니다.

SSL 인증서

정상적으로 모두 검사를 통과했네요

그리고 아래 사이트를 통해서 인증서도 제대로 설치되었고, 보안도 제대로 작동하고 있는지 등급을 체크해볼 수 있습니다.

 

SSL

A 등급이 나왔군요. 다행입니다. 저는 구형브라우저는 배려하지 않습니다.

A등급이 나왔다는건 SSL 인증서가 완벽하게 설치됐으며, 보안이 취약한 구형 브라우저(대표적으로 IE6~8) 에서는 정상작동하지 않는다는 이야기입니다. B등급 정도면 제대로 설치도 됐고, 대부분의 브라우저에서 작동한다는 이야기이고, C등급이 나왔다면 SSL 인증서를 설치하나 마나라는 이야기입니다.

인증서 자동 갱신

그리고 letsencrypt SSL 인증서는 3개월마다 한번씩 인증을 새롭게 해줘야하기때문에 까먹고 있다가는 어렵게 해놓은 인증서가 도루묵이 됩니다. 그렇다고 3개월마다 꼬박꼬박 챙기기도 어려우니 자동으로 매주 월요일 새벽에 업데이트 내용을 확인하고 자동으로 인증하는 코드를 추가했습니다. – https://blog.lael.be/post/5107 4번 챕터 참고

아래 명령어를 입력해 자동으로 수행할 명령을 입력할 수 있는 화면으로 진입합니다. 에디터를 고르라는 창이 뜰 경우 원하는 에디터를 선택하면 됩니다. 저는 2번 nano가 쉽고 편해서 nano로 편집했습니다.

편집 창이 뜨면 아래 소스코드를 맨 하단에 넣어줍니다. 제가 참고한 사이트에서 설명하는 바에 의하면 “월요일 5시 10분에 새로운 인증서가 발급됐는지 확인하고 적용한다음, 5분뒤인  5시 15분에 아파치 서버를 리로드 하는 명령이 순차적으로 진행”되도록 예약해놓는 내용이라고 합니다.

ssl

이런식으로 작성되었습니다.

워드프레스 접속 주소 설정

이제 마지막으로 워드프레스 상에서 설정 > 일반으로 들어가서 아래와 같이 https로 주소를 바꿔주고 저장해주어야합니다.

저의 경우에는 관리자 화면으로 바로 들어갈 수가 없어서 어쩔수 없이 phpmyadmin으로 접속해서 데이터베이스상에서 wp_options 테이블에서 바로 수정해주었습니다. 혹시라도 사이트 주소를 잘못 바꿔서 정상접속이 안될 경우에도 아래 사진과 같이 데이터베이스상에서 직접 수정해주면 잘못 연결된 워드프레스 주소를 정정 할 수 있습니다.

이러한 과정을 모두 마무리하고 웹브라우저에서 https://blog.illustudio.co.kr로 접속하면, 아래와 같이 PC와 모바일 브라우저에서도 보안상 안전한 사이트라고 안내되는걸 확인할 수 있습니다.

ssl

PC용 구글 크롬 브라우저 주소창

ssl

아이폰용 사파리 모바일 브라우저

ssl

아이폰용 구글 크롬 모바일 브라우저

HTTPS 보안 프로토콜로 접속되도록 설정

하지만 보통 사용자들이 입력할때 https://까지 입력하는 경우는 흔치 않습니다. 보통 그냥 blog.illustudio.co.kr을 입력하는 편이 더 자연스럽죠. 이런 경우에는 힘들게 https로 준비된 사이트임에도 불구하고 http로 접속이 됩니다.

그래서 아파치 mod_redirect 를 이용해 http 즉 80번 포트로 접속할 경우 강제로 https 프로토콜로 접속하도록 설정해주는 부분을 추가했습니다. 참고 – http://taesachi.com/?p=6 

아래 화면과 같이 virtualhost 80번 포트 접속시에 리다이렉트 시키도록 설정 된 부분이 맨 밑에 기술 되어있는 것을 확인할 수 있습니다.

이 과정을 모두 마무리 한다음 다시 아파치 서버를 재시작 (sudo service apache2 restart) 시켜주면 별도 입력 없이도 https 보안 프로토콜을 통해 접속하는 것을 확인 할 수 있습니다.

좋은 내용을 공유해주신 분들 덕분에 성공적으로 SSL 설치를 마칠 수 있었습니다. 추후에 다시 설치할 불상사(?)를 겪을지도 몰라 설치 과정을 기록하는 차원에서 포스팅했습니다.

Route531 은 기본적으로 인스턴스2 상에서 생성된 하위폴더를 서브도메인으로 지정해주는 기능이 없다. 현재 이 곳에서 운영되고 있는 블로그 주소를 예로 들면 illustudio.co.kr/blog 를 blog.illustudio.co.kr 로 만들어 주는 기능이 없다는 이야기다.

이것을 가능하게 하려면 일단 Route53에서 blog.illustudio.co.kr 이란 서브도메인을 a 레코드로 생성해주는데, illustudio.co.kr 와 동일한 IP로 연결되도록 설정한다. illustudio.co.kr / blog.illustudio.co.kr  두 주소 모두 같은 장소로 들어오게 만들어주는 것이다.

그리고 이 주소를 식별해서 연결될 폴더를 지정해주는 부분은 아파치 서버에서 세팅한다. 우분투를 기준으로 봤을때 LAMP를 설치했다면 /etc/apache2/sites-available/default.conf 파일에서 설정해줘야한다.

아래 소스를 참고해서 적절하게 필요한 부분을 추가/수정해서 사용할 필요가 있다.

이런 부분을 해결해주고 나면 기본적으로 동일한 아이피로 들어오더라도, 사용자가 어떤 도메인을 입력하고 들어왔느냐에 따라서 아파치 서버가 적절한 위치로 연결해주게 되는 것이다. 위의 내용을 default.conf가 아닌 별도의 파일로 따로 생성해서 작성했다면, 아래의 명령어를 입력해서 작성된 파일이 사용가능한 상태 – enabled 시켜줘야한다. 기본 default.conf 파일을 수정해줬다면, 이미 enable되어있는 상태이니 a2ensite 명령어를 사용할 필요는 없다.

이렇게 아파치 서버에 가상호스트를 설정해주면 서브도메인을 사용할 수 있다. 다시 한 번 정리하자면, 아마존 웹 서비스의 Route53에서는 서브도메인을 지원하지 않기 때문에 우회적인 방법으로 아파치 가상호스트를 이용해서 서브도메인을 사용하는 방법이다.

워드프레스 멀티 사이트를 운영하거나, 별개의 사이트를 다수 운영할 경우에 서브도메인을 할당하고 싶을 때 활용할 수 있는 방법이다.


  1. 아마존에서 제공하는 DNS – Domain Name Service. 쉽게 말해서 도메인 주소를 관리해주는 서비스다. (유료) 
  2. 아마존에서 제공하는 가상의 서버를 인스턴스라고 한다. 아마존의 인프라를 이용해 클릭 한 번으로 서버가 주어지게 된다.  ‘프리티어’ 라는 서비스로 1년간 무료체험을 제공하고 있다.