본문 바로가기

뭔가 컴퓨터

Microsoft Azure Web app + Let's encrypt SSL(HTTPS)


좀 된 이야기인데, 법이 바꼈는지 어쨌는진 몰라도 이제 회원가입&로그인 등의 최소한 개인정보와 관련된 작업을 하는 웹싸이트는 관련 패킷을 모두 암호화해야된다. 쉬운말로하면 HTTPS로 만들어야한다는 얘기. (굳이 HTTPS가 아니더라도 데이터를 암호화하면 되는 것 같다만, 정확히는 잘 모르겠다)


가장 쉽고 확실하면서 믿을만한 방법은 서버에 SSL인증서를 때려박고 HTTPS 통신으로 만들어주는게 있다.

그런데 SSL보안인증서 좀 살펴보면 알겠지만, 취미로 싸이트를 운영하는 수준에서는 비싸다.


하지만 데이터는 소중하므로 누군가 무료 SSL 인증서를 친히 발급받을 수 있도록 만들어놓으셨다.

크게 StartSSL과 Let's encrypt 두개가 있는데, 앞에꺼는 잘 모르겠고 뒤엣것을 이용하기로 한다. (예전에 node.js서버에 Let's encrypt로 보안서버구축하는거 올려놓긴 했었다)


플러그인같은게 있는 것 같은데, 솔직히 어떻게 써야할지 감이 안와서 직접 Let's encrypt를 통해 인증서를 발급받고 그걸 Web App에 적용하는 식으로 할거다.


일단 아래와 같은 전제조건을 깔고 시작하자. 아래와 다를 경우 나도 잘 모르겠다.

1. 개인 도메인 소유 (id.azurewebsites.net이런거 말고 개인 도메인. 아마 있어야되는걸로 안다. 지식이 짧아서 죄송하다.)

2. Microsoft Azure에서 Service plan이 최소한 custom domain과 SSL certifications를 지원해야함 (무료/공유는 지원 안함. Basic부터 지원)

3. Windows 10 + Ubuntu bash 활성화 상태. (또는 Linux나 Mac OS X도 될거임. 아래 설명은 Ubuntu bash on Windows10을 기준으로)

3-1. Windows 계정이 영문이어야함. 또는 사용자 계정 폴더 이름이 영문이어야함. 아니 그냥 appdata 경로에 유니코드 문자가 섞이면 안되는 것 같다.

4. 개인 도메인이 본인의 Web App에 연결이 되있어야함. (도메인업체에서 A레코드랑 CNAME 이런거 추가되어서 Azure에 연결되있어야됨)

이 정도가 일단 준비가 되어있어야한다.


적용하는 방법.


1. Ubuntu bash에 Let's encrypt 인증서를 발급받을 수 있도록 관련 소프트웨어들을 설치한다.

우리는 Certbot이라는 친구를 이용해서 인증서를 발급받을 것이다. https://certbot.eff.org 에 가면 설치 방법이 나와있다.

"I'm using [None of the above] on [Ubuntu 16.04]" 이걸로 선택해서 아래 나오는 설명을 따라가면서 설치하면 된다.

또는 아래 회색박스를 이용해서 certbot을 설치한다. (내가 했던 방법이며, 싸이트에 나와있는 방법을 가져옴)

$ sudo apt-get update

$ sudo apt-get install software-properties-common

$ sudo add-apt-repository ppa:certbot/certbot

$ sudo apt-get update

$ sudo apt-get install certbot


2. Certbot을 이용해서 인증서를 발급받는다.

이 때, 우리는 위 싸이트에 나온 --standalone옵션이나 --webroot옵션이 아닌 --manual 옵션을 이용해서 직접 인증서를 발급받고 뽑아낼것이다.

$ sudo certbot certonly --manual

저렇게 --manual을 붙여주면 수동으로 인증서를 만들고, 도메인 인증도 수동으로 한다.


도메인 주소를 입력하라는 질문이 나오면, 본인의 도메인 주소를 입력한다. 이 때, 도메인 주소의 구분은 띄어쓰기로 하면 된다.

나의 경우

www.ciiwolstudio.com ciiwolstudio.com

이렇게 두개를 입력해줬다. 보통 저렇게 두 개 해주면 될거임. 본인이 Web App에 연결해놓은 도메인중 HTTPS 연결이 필요한 도메인 다 적으면 되겠다.


그 다음에 IP수집에 관한 동의가 나올텐데, 이거 No로 해도 되는지 모르겠다. 예전에 해봤다가 안됐던걸로 기억하긴 하는데 잘 기억이 안난다. 무난하게 Yes로 해줬다.

아마 새로운 인증서를 갱신할 때, 인증서를 요청한 PC의 IP주소를 수집하는 것 같다.


3. 도메인 주소를 인증한다.

여기가 조금 어려울 수 있다. 인증서라는게 그냥 대충 달라고 하면 뚝딱 주는게 아니고, 입력한 도메인 주소가 실제로 본인이 소유한 주소인지 확인되어야 한다.

DNS설정에서 TXT레코드? 이런거로 인증하는 방법도 있는데(Microsoft Azure는 이걸로 인증), Let's encrypt는 아예 저 도메인 주소에 Request를 날려서 지정된 Response를 뿌리는지로 판단한다.

뭐 글자가 많이 쓰여있는데, 간단하게 설명하자면

www.mydomain.com/.well-known/acme-challenge/qwertyui :

qwertyui.asdfghjk

이런식으로 앞부분에 표시가 되어있을건데, 위에 주소로 들어갔을 때 아래 글자들을 반환해야 한다는 얘기이다.

즉, 내가 직접 도메인에 설정을 하든 서버에 설정을 하든 FTP로 파일 올려서 설정을 하든, 저게 가능하게끔 만들어주면 된다.

아래 설명은 위에 회색박스의 내용을 기준으로 설명한다. 실제로는 본인의 화면에 뜬 문자열을 가지고 진행하여야한다. (참고로 문자열 저거보다 한 5배정도 길다)


우선, FTP에 접속해서 wwwroot 폴더 안에 '.well-known'이라는 폴더를 만들어주고, 그 안에 'acme-challenge'라는 폴더를 만들어주자.

평소같으면 그냥 acme-challenge 폴더 안에 'qwertyui.asdfghjk'의 내용을 가진 'qwertyui'파일을 만들어서 때려박으면 되지만, 우리의 Web App(IIS)는 이 방법이 안되는 것 같다. 그래서 조금 다르게 해줘야된다.

우선 본인의 PC에서 index.html 을 하나 만들어주고, 파일 내용은 'qwertyui.asdfghk'로 한다. (태그같은거 필요 없고 오로지 qwertyui.asdfghkj만 있으면 됨)

그 다음, FTP에서 acme-challenge폴더 안에 'qwertyui' 폴더를 만들어주고, 그 안에 위에서 만들어준 index.html을 넣어준다.

이렇게 하면 이제 위에 주소로 접속했을 때 자동으로 index.html을 열게 되고, index.html속 파일 내용을 출력할 것이다.


이 과정이 끝났으면 Enter키를 한번 누른다. (확인차 Enter를 누르기 전에 저 주소로 한번 접속해보자. 문자열을 뿌리면 정상)

위에서 도메인을 1개만 등록했으면 바로 인증이 진행되지만, 2개를 등록했으면 똑같은 과정을 한번 더 해야된다. 3개했으면 세번 해야된다. 문자열 내용이 달라지기 때문에 도메인 개수만큼 폴더와 파일을 acme-challenge 폴더 안에 넣어주면 된다.

똑같은 내용 한번 더뜬줄알고 엔터 누르면 안되고, 꼭 도메인 2개를 입력했으면 두번 해야된다.


모든 설정을 끝내고 Enter키를 누르면 자동으로 인증이 진행된다.

약간의 시간이 걸린 후 결과가 나오는데, 제대로 따라왔다면 "Congratulations!"로 시작하는 내용이 뜰 것이다. 

파일은 Ubuntu bash 속의 /etc/letsencrypt/live/www.mydomain.com 안에 들어있다. (위치 출력해줌)

실패했을 경우 그 원인이 너무 다양하기 때문에 딱히 뭐 어떻게 설명을 못해주겠음.


4. 만들어진 키체인 파일들을 가지고 pfx파일을 뽑아낸다.

서버마다 요구하는 SSL인증서 파일이 다르긴 한데, 우리의 Web App(IIS)는 pfx파일을 요구한다. 하지만 눈씻고 아무리 찾아봐도 .pem으로 끝나는 파일들밖에 없다.

사실 이 pem으로 끝나는 파일들만 있으면 어떤 형식이든 만들어낼 수 있는 것 같다. 쉽게 생각해서 변환이 된다고 보면 될듯.

Ubuntu bash에서

$ su

# cd /etc/letsencrypt/live/www.mydomain.com

이런식으로 해서 관리자 권한으로 인증서 파일이 있는 폴더에 접근을 하자.

$ ls 이거 쳐봐서 파일 목록들 확인한다. cert.pem chain.pem fullchain.pem privkey.pem 이렇게 있으면 정상이다.

이제 openssl를 이용해서 pfx파일을 뽑아낼 것이다. 아래의 커맨드를 입력한다.

# openssl pkcs12 -export -out "certificate.pfx" -inkey "privkey.pem" -in "cert.pem" -certfile "chain.pem"

그냥 저 키와 키체인 인증파일 이것저것 잘 섞어서 certificate.pfx라는 파일로 병합해서 추출하겠다는 얘기인 것 같다.

저걸 치면 Export password를 치라고 하는데, 본인이 pfx파일에 적용할 암호를 만들어주면 된다. 알아서 강력하게 잘 만들어주자. 이거 암호 잊으면 안된다.

암호확인까지 치고 나면, /etc/letsencrypt/live/www.mydomain.com 폴더 안에 certificate.pfx 라는 파일이 생겼을 것이다. 이 파일이 우리가 Web App에 업로드할 인증서파일이다.


5. pfx파일을 Azure Web App에 업로드한다.

거의 다 왔다.

우선 pfx파일을 업로드하려면 이 파일을 Ubuntu bash에서 빼내야된다.

기본적으로 Ubuntu bash는 

C:\Users\User\AppData\Local\lxss

에 설치되어 있다. (중간에 User가 본인 윈도우 계정)

즉, 우리가 지금까지 Certbot으로 만든 Let's encrypt 인증서는

C:\Users\User\AppData\Local\lxss\rootfs\etc\letsencrypt\live\www.mydomain.com

에 있다는 얘기이다. 윈도우 탐색기를 통해 저기로 들어가보면 pem파일 4개랑 방금 추출한 pfx파일 하나가 자리잡고있다. 우리가 필요한건 pfx파일뿐이므로 얘를 복사한다. 본인의 작업상태에 따라 나머지 pem키를 백업하는 것도 좋다.


pfx파일을 이제 Web App에 업로드해야한다. Azure portal에서 본인의 Web App에 가서 찾아보면 "SETTINGS > SSL certificates"라는 메뉴가 있다.

거기 들어가면 처음에는 당연히 아무것도 없다. "Upload Certificate"를 누르고, 본인이 추출한 pfx파일을 선택한 후, 추출할 때 만들었던 비밀번호를 입력해주고 업로드하면 된다.


그럼 SSL certificates 설정에 본인이 업로드한 인증서가 나타날건데, 이제 이걸 도메인에 바인딩만 해주면 된다.

아래에 SSL bindings > +Add binding 버튼을 눌러주자.

Hostname에 본인의 도메인, Certificate에 본인이 방금 올려놓은 인증서, SSL Type은 그냥 SNI SSL로 냅두고 "Add binding"을 클릭한다.

계속 Add binding 눌러서 자기가 연결한 도메인 다 바인딩해주면 된다.


6. 확인

웹브라우저 캐시를 다 날리고(브라우저마다 다른데, 안날리면 안되는 브라우저가 있음) 본인의 도메인 앞에 https:// 를 붙이고 접속해보자.

아니면 안쓰는 웹브라우저 켜서 해도 되고.



나머지 작업(자동으로 http -> https 리다이렉트)은 본인이 알아서 해주면 되겠다. 만약 워드프레스같은 CMS를 사용한다면 CMS 설정을 잘 찾아보면 있을것이다.


참고링크, 위에 4번 절차부터 잘 나와있다.

https://docs.microsoft.com/ko-kr/azure/app-service-web/app-service-web-tutorial-custom-ssl


https 보안서버 구축이 공짜라니!



Microsoft Azure Web App은 저렇게 바인딩까지만 해주면 알아서 다 해준다. 편하다.

만약 순수 톰캣 아파치 nginx 이런거로 서버 구축한다면 포트 연결해주고 이런거 다 해줘야되는걸로 기억한다. (근데 요즘 세상 좋아져서 이런거도 알아서 해주는 프로그램 있음)



Azure Web App 말고 그냥 국내 웹호스팅도 SSL 인증서를 설치해서 https 보안서버로 만들 수 있다.

단, 국내 웹호스팅은 호스팅 업체마다 해주는 곳도 있고 안해주는 곳도 있으니 본인이 잘 선택하면 된다. (Cafe24의 경우 해주는걸로 알고있고, 일반적으로는 타사 SSL인증서 설치는 따로 돈을 받는걸로 알고있다.)



아, Let's encrypt는 보안인증서 만료기간이 3개월이다. 즉 3개월마다 갱신을 해줘야한다.

갱신을 하기 위해 위에 작업을 귀찮게 반복할 필요는 없고, certbot renew기능을 이용하면 보다 간단하게 갱신이 된다고 한다. (아직 갱신을 해본적이 없어서..)

만약 비번을 까먹었거나 하면 다시 처음부터 진행해서 재발급을 받으면 되겠다.