티스토리 뷰

dev

무료 SSL 인증서 적용(Let's Encrypt)

IT's me 2023. 8. 19. 09:00

오늘은 무료 SSL 인증서 "Let's Encrypt" 적용 방법에 대해서 알아보겠습니다. https는 http의 보안프로토콜입니다. 이를 이용하기 위해서는 SSL 인증서라는 게 있어야 되는데 보통 유료로 구입들을 하게 되죠. 이걸 바로 무료로 배포를 해주는 고마운 사이트가 https://letsencrypt.org인 것입니다. ISRG (Internet Security Research Group) 에서 제공하는 서비스라고 하네요. 

무료 SSL 인증서 적용(Let's Encrypt)

네 아마 이런게 있다고 하더라도 기업들은 무료 인증서는 안쓸 것 같습니다. 유료 인증서를 구입하면서 드는 책임배상보험이 있어서 그런데요.  뭐... 우리야 같은 동일한 레벨의 알고리즘을 사용하는 것을 알고 있지만 기업들의 책임전가식 업무는 '내돈 아니니까 내가 책임만 안지면 돼'라는 사상이 밑바탕에 깔려있거든요. 😊 아직 Let's Encrypt의 단점들이 남아있기도 하고요.


그렇다면 무료 SSL과 유료 SSL의 차이는?

 

그렇다면 이쯤에서 유료 인증서와 무료 인증서 차이가 있는지 궁금하실텐데요. 네이버 보안 서명 알고리즘과 제가 운영중인 사이트를 비교 확인해보았습니다.

 

무료 SSL과 유료 SSL의 차이

 

네 둘다 알고리즘이 sha256으로 동일하다는 것을 알수 있었습니다. 무료라고 무시하거나 불안해하실 필요가 전혀 없다는 이야기입니다. 사실 우리가 운영하는 블로그나 개인 사이트들에 굳이 https를 적용할 필요는 없지만 사이트의 신뢰도를 높이기 위해서겠죠.

 

무료 SSL 인증서 적용

 

요 자물쇠 모양을 달기 위해서 뭔가 있어보이기 위해서... SEO적으로도 검색 사이트에서도 https를 지원하면 그 사이트의 점수를 높게 준다는 말을 본거 같으니까 적용해봅시다. 그리고 가능하다면 http/2의 기본 스펙 또한 https(ssl)이 기본이니 적용해서 http2 또한 적용해봅시다. http2는 꽤나 빠르답니다. 


무료 SSL 인증서 Let's Encrypt 단점

 

무료이니 만큼 단점이 있습니다. 앞으로 개선될수도 있겠지만요~

 

단점1. 인증서 유효기간은 90일이다.

  • 3개월에 한번씩 인증서 갱신을 해주어야 합니다.
  • 하지만 자동 갱신 설정을 해주면  자동으로 갱신이 되니 단점이라 할수가 없습니다. 

2. 멀티도메인 지원이 안됩니다.

  • 서브도메인이라고도 하죠. example.com을 받았는데 sub.example.com을 쓰고 싶다면 sub.example.com을 위한 인증서를 또 받아야 합니다. 한번 받아서 계속 사용할 수 있는 *(asterisk).example.com 도메인 처리가 안된다는거죠.

이런 불편함이 있지만 무료인데 뭐 어떻습니까. 더군다나 3개월 주기로 자동 갱신까지 해주는 서비스가 있으니 한번 제대로 해 놓으면 손을 안대도 됩니다. 저...저는 운영서버가 tomcat이라 수동(메뉴얼) 갱신을 해주어야 하지만요. 😭

장점모든 단점을 커버하는 무료라는 그것 하나! 가 있습니다. 


무료 SSL 인증서 Let's Encrypt 설정 방법

 

그럼 설정을 해봅시다. 우분투 환경이지만 centos, 페도라 등도 크게 다르지 않을듯 합니다. 명령어만 os에 맞게 바꿔주면 되겠습니다. 

 

certbot.eff.org/docs/install.html#about-certbot

 

Get Certbot — Certbot 1.15.0.dev0 documentation

Certbot is meant to be run directly on a web server, normally by a system administrator. In most cases, running Certbot on your personal computer is not a useful option. The instructions below relate to installing and running Certbot on a server. System ad

certbot.eff.org

 

1. certbot(letsencrypt) 설치!

 

우분투

 

$sudo apt-get install certbot

 

 

2. https를 적용할 웹 루트로 이동

 

cd [webroot dir]

 

3. let’s encrypt 실행

 

sudo certbot certonly --webroot -w . -d [사용할도메인주소]

 

저의 경우는 이렇게 했습니다.

 

certbot certonly --webroot -w . -d cocomon.kr

 

제 노닥거리는 우분투 서버로 실제 제가 구입한 도메인인 cocomon.kr 에 적용해보기로 해보죠!

 

무료 SSL 인증서 적용

 

쉽게 말해 도메인 소유를 확인하는거죠. 먼말인고 하니

http://cocomon.kr/.well-known/acme-challenge/MUuEgsrDx6rk5GB5BCVRJbSYfUxJ9a9ZADXr_o_1lMI

위 url 경로에 저 위 경로의 파일이 있어야 하며...그 파일의 내용은 요런 텍스트가 되어야 한다는거죠.

MUuEgsrDx6rk5GB5BCVRJbSYfUxJ9a9ZADXr_o_1lMI.L6gvbjzqk4bM-R8DqdFXDqf99CT0w8zp-2l_NLfmfEc

 

위 명령어인 

certbot certonly --webroot -w . -d cocomon.kr

를 입력하게 되면 위 과정이 자동으로 이루어지게 되는 것입니다. 따라서 웹 서버가 실행중으로 80 포트로 해당 도메인이 열려있어야 하고 웹 루트에 해당 디렉토리 구조와 파일을 생성할 수 있는 권한이 필요해집니다. 

 

과거 certbot, letsencrypt 에서 수기로 한다면 아래 과정을 거쳐서 했었죠. ( 전에는 손으로 했었습니다. )

 

1. 웹서버에 .well-known 디렉토리를 생성

mkdir .well-known

 

2. 생성된 디렉토리로 이동

cd .well-known

 

3. acme-challenge 디렉토리 생성

mkdir acme-challenge

 

4. acme-challenge 로 이동

cd acme-challenge

 

5. MUuEgsrDx6rk5GB5BCVRJbSYfUxJ9a9ZADXr_o_1lMI 파일을 생성 및 편집한다.

vi MUuEgsrDx6rk5GB5BCVRJbSYfUxJ9a9ZADXr_o_1lMI

 

6. 파일 내용에 문자열 입력 후 저장

 

파일 내용에 'MUuEgsrDx6rk5GB5BCVRJbSYfUxJ9a9ZADXr_o_1lMI.L6gvbjzqk4bM-R8DqdFXDqf99CT0w8zp-2l_NLfmfEc' 입력 후 저장

 

 

이 디렉토리 생성 및 저장은 사용자 환경마다 다를 수 있긴합니다.

 

그리고 나서 윗 단계에서 엔터를 치면...

Press Enter to Continue Waiting for verification... Cleaning up challenges IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/steemalls.com/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/steemalls.com/privkey.pem Your cert will expire on 2018-02-16. To obtain a new or tweaked version of this certificate in the future, simply run letsencrypt-auto again. To non-interactively renew *all* of your certificates, run "letsencrypt-auto renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

축하한다고 당신의 인증서를 성공적으로 만들었다고 메세지가 나옵니다. 적용해봅시다. 두가지의 파일이 생성 되었습니다. fullchain.pem과 privakey.pem 이죠. 이 경로를 따로 잘 저장해둡니다. 경로에서 직접 확인해본 모습입니다. 

root@ubuntu:/etc/letsencrypt/live/cocomon.kr# ll

total 12

drwxr-xr-x 2 root root 4096 Apr 24 19:00 ./

drwxr-xr-x 4 root root 4096 Apr 24 18:58 ../

lrwxrwxrwx 1 root root   34 Apr 24 18:58 cert.pem -> ../../archive/cocomon.kr/cert1.pem

lrwxrwxrwx 1 root root   35 Apr 24 18:58 chain.pem -> ../../archive/cocomon.kr/chain1.pem

lrwxrwxrwx 1 root root   39 Apr 24 18:58 fullchain.pem -> ../../archive/cocomon.kr/fullchain1.pem

lrwxrwxrwx 1 root root   37 Apr 24 18:58 privkey.pem -> ../../archive/cocomon.kr/privkey1.pem*

-rw-r--r-- 1 root root  692 Apr 24 18:58 README

Letsencrypt, certbot 자동 갱신 사용!

 

1. 인증서 남은 기간 확인

$ certbot certificates

위 명령어를 넣으면 현재 가진 인증서 상태를 확인할 수 있습니다. 남은 날짜도 확인 가능하죠. 

 

certbot 자동 갱신 기능은 인증서 남은 일자가 한달 이내( 30일 이내) 여야 정상적으로 동작이 됩니다. 

 

2. 자동 갱신 동작 확인

$ certbot renew --dry-run

위 명령어는 제대로 갱신이 되는지 확인해보는 명령어입니다. 

 

3. 자동 갱신 명령어 입력

$ certbot renew

아주 간단하죠? 그러나 3개월마다 접속해서 이 명령어 조차 남기는 것이 귀찮다면 리눅스 스케줄러인 크론탭을 이용해서 저 명령어를 주기적으로 등록해주면 됩니다.

 

$ vi /etc/crontab

0 0 1 * * /usr/bin/certbot renew --renew-hook=“[서비스재시작 명령어]”

 

 

--renew-hook 은 갱신이 되었을 때 실행해주는 스크립트인데요. 인증서 갱신이 되었으니 웹 서비스를 재기동할 수 있는 명령어를 넣어주면 될겁니다. 


웹루트 외에도 엄청나게 다양한 인증서 생성 방법을 지원

가장 범용적으로 사용할 수 있는 방법인 웹루트 외에도 웹서버로 가장 많이 사용되는 apache, nginx 옵션만 넣어주면 자동으로 해주는 옵션과 인트라넷과 같은 프라이빗 존에서 사용할 수 있는 스탠드어론 모드, '*' 멀티 도메인을 지원하는 인증서를 만들수 있는 DNS Plugins방법과 갖가지 많은 써드 파티 솔루션들( 아마존, 클라우드플레어 등등 ) 을 지원하는 플러그인까지 거의 모든 상황에서 ssl, https 인증서를 사용할 수 있는 방법들을 지원하고 있습니다. 

 

그 내용은 아래 링크에서 확인해보면 될것 같구요. 적용 방법이 친절하고 쉽게 나와있으니 따라하실수 있을 겁니다. 

 

이번에 새롭게 인증서를 받으면서 dns txt 레코드를 등록하는 방법을 이용했는데 아주 편했습니다. 

 

$ certbot -d cocomon.kr --manual --preferred-challenges dns certonly

 

이렇게 입력하면 _acme-challenge.[도메인]에 텍스트(txt) 레코드로 일정한 값을 넣으라고 하는데 이걸 넣고서 도메인 관리 사이트에서 저장 누른 다음에 다시 확인을 누르면 받아집니다. certbot( letsencrypt)에 의하면 dns 레코드를 이용해서 받으면 멀티 도메인 지원 인증서가 가능하다고 하니 이걸로 하면 편하게 사용할 수 있을 것 같네요. ( 강추 ! ) 

 

 

certbot.eff.org/docs/using.html#webroot

 

User Guide — Certbot 1.15.0.dev0 documentation

To view a list of the certificates Certbot knows about, run the certificates subcommand: Certificate Name shows the name of the certificate. Pass this name using the --cert-name flag to specify a particular certificate for the run, certonly, certificates,

certbot.eff.org

 

아 단지 멀티 도메인 인증서 등록 방법은 메뉴얼 등록이기 때문에 certbot renew가 자동으로 되지 않습니다. 

 

nhj@ubuntu20:~$ sudo certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/cocomon.kr.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Could not choose appropriate plugin: The manual plugin is not working; there may be problems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.')
Attempting to renew cert (cocomon.kr) from /etc/letsencrypt/renewal/cocomon.kr.conf produced an unexpected error: The manual plugin is not working; there may be pro                     blems with your existing configuration.
The error was: PluginError('An authentication script must be provided with --manual-auth-hook when using the manual plugin non-interactively.'). Skipping.
All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/cocomon.kr/fullchain.pem (failure)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

All renewal attempts failed. The following certs could not be renewed:
  /etc/letsencrypt/live/cocomon.kr/fullchain.pem (failure)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1 renew failure(s), 0 parse failure(s)

 

아래처럼 다시 메뉴얼 등록을 해주어야 하는 것이죠. 

 

$ certbot -d cocomon.kr --manual --preferred-challenges dns certonly
$ sudo certbot -d *.iinfo.kr --manual --preferred-challenges dns certonly

 

멀티도메인을 처리하려면 두번째 줄 처럼 *.[도메인주소] 식으로 certbot에 입력해주시면 됩니다. 

 

다시 이걸 넣어야 하고 여기서 안내되는 txt 레코드 값을 입력하고 인증해야 발급이 정상적으로 이루어지기 때문입니다. 

 

▼ 도메인 사이트에서 txt 레코드 확인하기 ▼

C:\> nslookup -type=TXT _acme-challenge.iinfo.kr

 

이런식으로 txt 레코드를 확인하고나서 좀 시간을 기다렸다가 Press Enter to Continue를 해주세요. 

 

 

 


nginx 서버의 설정

 

가장 많이 사용하는 nginx 서버의 설정입니다.

nginx.conf를 찾아 아래내용을 추가했습니다.

 

listen 8443 ssl default_server; 
listen [::]:8443 ssl default_server; 
ssl on; 
ssl_certificate /etc/letsencrypt/live/cocomon.kr/fullchain.pem; 
ssl_certificate_key /etc/letsencrypt/live/cocomon.kr/privkey.pem; 
ssl_session_timeout 5m; 
ssl_protocols SSLv2 SSLv3 TLSv1; 
ssl_ciphers HIGH:!aNULL:!MD5; 
ssl_prefer_server_ciphers on;

 

그리고 서비스 재시작 후 https://cocomon.kr으로 접속하면 자물쇠가 뙇! 아 저의 경우 443으로 들어오는걸
8443으로 포워딩 되게 설정해서 8443으로 설정한 것입니다. 포워딩 안하시는 분들은 443으로 설정하세요. ( 사진은 예전에 사용하던 도메인이고 지금 도메인인 cocomon.kr으로 접속해보면 ssl 인증서를 확인할 수 있습니다. ) 

기간이 3개월이라는 아쉬움이 있지만 certbot renew를 활용하면 자동갱신이 되니 그럴것도 없겠죠. ?

 

cocomon ssl 서명 알고리즘

알고리즘이 sha256으로 네이버에서 사용하는 알고리즘과 동일한 것을 확인할 수 있습니다. 보안 레벨은 동일하다는 것을 알수 있겠죠? 

네이버 서명 알고리즘

 

물론 가장 많이 사용하는 nginx가 아니더라도 거의 대동소이하게 간단하게 적용하실 수 있습니다. 웹서버 별 설정은 certbot.eff.org/ 이곳에 잘 나와있네요.

무료 SSL 인증서 적용

여기까지 무료 SSL 인증서 Let's Encrypt, Certbot 적용 방법에 대해서 알아봤습니다. 


댓글
최근에 올라온 글
최근에 달린 댓글