암호화된 안전한 프로토콜 https
우리가 웹 페이지를 열때 보통 http나 https 프로토콜을 사용한다.
https는 통신 과정에서 암호화 단계를 거쳐 정보를 주고받지만
http는 그런거 없이 쌩 데이터를 주고받는다.
즉 중간에서 통신 정보를 가로채기만 한다면 사용자가 전송한 파일, 비밀번호 등을 암호화없는 쌩 데이터 그대로 도청할 수가 있다는 것이다.
이것은 클라이언트 기기가 보안이 철저하다고 해서, 또는 수상한 와이파이에 연결하지 않았다고 해서 괜찮은 것이 아니다. 수상한 와이파이에 연결하지 않았어도 무선전파를 잡아서 데이터를 그대로 읽을수도 있으며(실제로 방법도 그리 어렵지 않으나 이를 시도할 시 정보뭐시기법 위반으로 벌금 3000만원 나온단다),
기기자체의 보안이 아무리 뛰어나다고 해도 그것과 전혀 상관없다.
http 프로토콜만 사용한다면 데이터를 그냥 쌩으로 전송하기때문에 그냥 내가 입력한 모든 것, 보낸 파일, 접속하는 사이트 등등을 전부 공개해버리는 꼴이다.
웹사이트에서 중요한 비밀번호를 입력했는데 누가 악심을 품고 공유기를 조작하거나 전파를 가로채면 그냥 다 털릴 수 있는거다.
이것만 봐도 http가 얼마나 답없는 프로토콜인지 알 수 있을것이다.
그래서 오늘날은 서로가 자신을 신뢰할 수 있는지 전자 서명이 포함된 인증서를 활용하여 신뢰할 수 있는 사이트(도메인)인지 확인하는 과정을 거치고 통신 과정에서 데이터를 암호화하는 TLS(SSL) 통신규격을 http에 적용시켜 이를 https 프로토콜이라 불러 사용하고 있다.
https는 사실 오래전부터 있었지만 몇 년 전 까지만 해도 SSL인증서를 이용하지 않고 https를 적용하지 않아 http만을 지원하는 사이트들이 많았다. 그러나 보다못한 구글이 이에 대한 심각성을 알리고자 Chrome 브라우저로 http 사이트를 열 경우 이 사이트는 안전하지 않은 사이트라고 경고를 띄워버리는 강수를 두면서 현재는 크롬에서 열리는 페이지들의 99%가 https를 지원하게 되었다.
웹사이트에서 https를 설정해두지 않고 http만을 사용한다면 안전하지 않은 사이트라는 꼬리표를 달아야 할 뿐더러 어떤 브라우저는 아예 접속을 차단해버리기도 하기 때문에 https는 권장이 아닌 거의 필수가 되었다 봐도 무방하다.
따라서 우리가 node.js로 웹을 만들었든 apache2 서버를 열었든 그냥 실험용으로 사용할 웹사이트가 아닌 특정 도메인을 가지고 외부에 공개할 웹사이트라면 SSL 인증서를 받고 따로 https 설정을 해주는 것이 좋다.
SSL인증서를 받는다 해서 어디 기관에서 돈내고 받아와야 하나 한다면 걱정은 안해도 된다.
과정이 그리 복잡한건 아니고 아래 과정만 잘 따라하면 되니 될 수 있으면 https 셋팅을 해두자
SSL(TLS) 인증서 발급받기
사실 SSL 인증서를 어디 기관에서 돈내고 받아야한다는 말은 반은 맞고 반은 틀리다.
SSL 인증서를 공신력 있는 기관에 금액을 지불하고 발급받아 적용시킬수도 있지만
쇼핑몰 운영같은 상업적 이용 등을 염두하고 사이트의 발전 가능성을 높게봐서 웹페이지에 많은 돈을 투자할 게 아니라면 무료 인증서를 이용할 수도 있다.
https://letsencrypt.org/ko/
Let's Encrypt는 전세계 웹사이트의 https 프로토콜 지원율을 높이기 위해 만들어진 비영리기관으로
자신이 도메인의 소유주임을 입증하기만 하면 무료로 SSL(TLS)인증서를 발급해준다.
대신 무료인 만큼 발급절차가 매우 간단하고, 이는 그만큼 사용자에게 신뢰감을 줄 수 없다는 단점이 될 수 있다.
이와 반대로 수동 검증을 통해 심사를 진행하여 이 사이트가 안전한 사이트임을 보증해주는 인증서 발급기관(CA)은 사용자에게 신뢰감을 주는 대신 가격이 꽤 비싼 것으로 알고있다.
하지만 우리는 인증서를 받아 통신과정에서 암호화를 지원하는 https 프로토콜만 이용할 수 있으면 되니 상관없다.
신뢰성을 증명해야하는 은행이나 보험사이트같은걸 운영할 계획이 아니라면 Let's Encrypt같은 무료 인증서를 사용해도 괜찮다.
그럼 이제 본격적으로 Let's Encrypt에서 SSL 인증서를 발급받아보자.
Let's Encrypt에서 인증서를 발급해주는 방식에는 크게 3가지가 있다.
1) Standalone
certbot이 80포트에 웹을 띄워서 도메인으로 접속해 본인 소유를 인증하는 방식이다.
가장 비효율적인 방식이며 80포트(http 전용 포트)를 이용하기 때문에 인증서를 발급받을때마다 현재 80포트에서 작동중인 http 사이트를 잠시 내려야 한다는 단점이 존재한다.
2) Webroot
웹의 루트 위치에 특정 파일을 만들어서 외부에서 접속하여 확인해 서버가 본인 소유임을 인증하는 방식이다.
3) DNS (추천)
Let's Encrypt에서 요구하는 특정 값을 DNS의 TXT 레코드에 추가하여 해당 도메인이 본인소유임을 인증하는 방식이다.
이 방식으로 발급받은 인증서는 와일드카드를 지원하여 해당 도메인의 모든 서브도메인에 사용이 가능하다.
예를들어 example.com 도메인의 인증서를 발급받았다면 인증서는 *.example.com으로 등록되어 aaa.example.com, bbb.example.com, ccc.example.com 등 모든 하위 도메인에도 사용이 가능하다.
반대로 1번과 2번의 방법으로 발급받은 인증서는 하위 도메인에 이용할 수 없고 하위 도메인에 이용하려면 각각의 인증서를 따로 받아 따로 적용시켜야 한다.
필자는 3번의 DNS 방식으로 받은 와일드카드 인증서를 추천하고
이 글에서도 해당 방법을 다루고자 한다.
(Ubuntu Server 22.04 기준)
우선 Let's Encrypt에서는 서버에 설치할 수 있는 자체 패키지를 제공한다.
letsencrypt와 certbot을 서버에 설치하자.
$ sudo apt install letsencrypt
$ sudo apt install certbot
그 다음 인증서를 발급받을 차례이다.
도메인 주소를 example.com으로 했을때를 가정하면
인증서 발급 명령어는 아래 한 줄이면 된다.
$ sudo certbot certonly --manual -d *.example.com -d example.com --preferred-challenges dns
이후 아래와 같이 나오는데 엔터를 한 번만 누른다
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for *.example.com and example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:
_acme-challenge.example.com.
with the following value:
(인증키 나오는곳)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
아래와 같이 다시 엔터를 한 번 더 누르라고 나오지만 일단 기다리고 아래 글을 먼저 따른다.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please deploy a DNS TXT record under the name:
_acme-challenge.example.com.
with the following value:
(인증키 나오는곳)
(This must be set up in addition to the previous challenges; do not remove,
replace, or undo the previous challenge tasks yet. Note that you might be
asked to create multiple distinct TXT records with the same name. This is
permitted by DNS standards.)
Before continuing, verify the TXT record has been deployed. Depending on the DNS
provider, this may take some time, from a few seconds to multiple minutes. You can
check if it has finished deploying with aid of online tools, such as the Google
Admin Toolbox: https://toolbox.googleapps.com/apps/dig/#TXT/_acme-challenge.example.com.
Look for one or more bolded line(s) below the line ';ANSWER'. It should show the
value(s) you've just added.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Press Enter to Continue
(인증키 나오는곳)이라 표시한 곳에 이상한 글자 조합의 키가 생성되었을 것이다.
이 때 우리는 두 번째로 나온 인증키를 이용할 것이다.
엔터를 누르기 전에 본인의 도메인 제공업체 관리툴로 이동해서 DNS TXT 레코드에 해당 키 값을 붙여넣어야 한다.
아래와 같이 도메인 제공업체 관리툴에서 DNS 설정을 추가해놓으면 된다.
타입: TXT
호스트: _acme-challenge
값/위치: (방금 받은 인증키)
적용하고 저장한 뒤 시간이 조금 지나면 서버에 반영되는데
서버에 적용이 되었는지 확인 후에 엔터를 눌러야 하기 때문에
새로 터미널 창을 열 수 있다면 아래와 같은 명령어로 txt레코드가 적용되었는지 확인한다.
$ dig _acme-challenge.example.com txt
위와같이 입력했을때 본인이 입력한 인증키가 보인다면 적용이 된 것이고 없다면 DNS서버에 적용되기까지 조금 더 기다려야 한다.
만약 새로 터미널 창을 열 수 없어서 명령어를 칠 수 없는 상황이라면 구글에서 제공하는 아래 사이트를 이용해도 좋다.
https://toolbox.googleapps.com/apps/dig/
txt를 선택하고 _acme-challenge.example.com을 입력해주면 된다.
본인이 입력한 인증키가 보인다면 서버에 적용이 완료된 것이다.
이렇게 입력한 레코드는 나중에 삭제하면 안된다. 발급받은 인증서의 인증이 풀릴 수 있다.
위 과정이 완료되었다면 이제 엔터를 눌러도 좋다.
정상적으로 완료되었다면
/etc/letsencrypt/live/example.com/ 경로에 인증서들이 생성되어있을 것이다.
Let's Encrypt에서 발급받은 인증서는 만료기간이 3개월이며 만료기간이 가까워지면 아까 입력한 이메일로 알림을 보내준다. 만료기간이 가까워졌을때 다시 certbot renew 명령어로 갱신해주면 된다.
이 인증서는 나중에 apache2나 node.js에서 https를 활성화할 때 이용할 수 있다. 해당 방법은 아래 글에 포스팅하였다.
https://logical02.tistory.com/25
'서버(리눅스)' 카테고리의 다른 글
apache2 SSL https 활성화하기 (0) | 2023.02.03 |
---|---|
apache2를 이용하여 서브도메인에 포트 연결하기(node.js 연동) (0) | 2023.02.01 |
새 서버 장만기(우분투 서버 22.04/Dell Optiplex 3070 Micro) (1) | 2023.02.01 |