이번에 새롭게 서버를 구축하면서 Let’s Encrypt SSL 인증 과정을 다시 음미할 수 있었는데요. 이 과정에서 알게된 얻게된 Let’s Encrypt SSL 인증서 활용팁 몇가지를 공유해 봅니다.
들어가며, Let’s Encrypt SSL 인증서 점유율은 어느 정도나 될까?
요즘 Let’s Encrypt SSL이 무료이면서도 서비스도 나쁘지 않기 때문에 새로운 사이트 설계시 Let’s Encrypt SSL를 많이 적용하는데요. 그렇기에 Let’s Encrypt SSL의 점율이 상당히 높다는 생각을 했습니다.
그러나 w3techs.com에서 집계하는 통계를 보니 Let’s Encrypt SSL는 전체 웹사이트에서 겨우 0.09% 수준에 불과하다고 합니다.
여기에는 인증서 자체도 없는 사이트가 너무나 많기 때문에 0.09%가 작은 적은 아니지만 기대한만큼은 아니라는 생각이 듭니다.
▽ Let’s Encrypt SSL의 점유율 2018년 7월까지
We provide HTTPS certificates to over 70 million domains. Is yours one of them? Donate and support a more secure Web! https://t.co/swycXbtpSz pic.twitter.com/xGiEiipOCB
— Let’s Encrypt (@letsencrypt) 2018년 3월 24일
2019년 12월 24일 현재 Let’s Encrypt SSL의 점유율은 0.1% 수준으로 조사 되는군요. 위에서 본 점유율보다는 어느 정도 상승한 수준이네요.
1. Let’s Encrypt SSL 인증서 발급 시 standalone 방식, webroot방식 무엇이 좋을까?
Let’s Encrypt SSL 인증을 받는 방법에는 standalone 방식과 webroot방식이 있는데요.
standalone 방식은 서버 자체에서 인증을 시도하는 방식이고 webroot 방식은 외부 웹에서 사이트에 접속해 문제가 없는지를 확인해 인증하는 방식입니다.
아무리 비영기관이라고하지만 Let’s Encrypt이 서버 자체에서 작업을 진행하는 것을 민감하게 받아드리는 사람들은 webroot 방식을 선호합니다.
이러한 webroot 방식을 이용하면
- 갱신 시 nginx 등을 중단시킬 필요없이 계속 서버가 작동하는 가운데 갱신 가능
- 외부 웹을 통한 인증이므로 서버 정보가 노출될 가능성이 적다.
다만 이 방식은 직접 운영하는 도메인을 확인하므로 여러개의 도메인을 한 서버, 사이트에서 등록시키기는 어렵습니다.
happist.com, www.happist.com과 같이 한가지 도메인 적용시만 안정적으로 작동합니다. ABC.com과 DEF.com을 동시에 인증이 어렵습니다.
반면 standalone은 프라이버시가 약화(?) 가능성이 있다고들 주장되고, 갱신 시 nginx를 작동 중지 시켜야 하는 약점은 있지만 정말 수많은 도메인(100개까지라고 함)을 한꺼번에 인증 받을 수 있습니다.
cd certbot # /certbot 디렉토리로 이동해 작업 시작
./letsencrypt-auto certonly —standalone -d happist.com -d www.happist.com -d it.com -d www.it.com -d san.com -d www.san.com
Code language: PHP (php)
저는 고민끝에 standalone을 유지하기로 했습니다. webroot 방식은 도메인을 여러 개 연결해 사용하는 경우 작동하지 않더군요.
2. Let’s Encrypt SSL 인증서는 몇번이나 설치할 수 있을까요?
서버를 세팅하다보면 본의아니게 서버 설치를 반복하게 되죠.
이런 저런 문제를 해결하고자 고민하다, 문제 원인을 못 잡으면 서버 자체를 다시 설치하는 경우도 있고, Let’s Encrypt SSL 인증서 설치 옵션 자체를 변경해 보다 완벽하게 설치하고 싶어 설치를 반복하기도 합니다.
설마 누가 라고 할 수 있지만, 서버를 설치하다보면 이런 저런 변수가 발생하고는 하죠. 제가 직접 그 경험을 했습니다.
여러 번 서버를 다시 설치하다 보니, 어느 순간 아래와 같은 메세지가 나오면서 발급이 안되더군요.
An unexpected error occurred:
There were too many requests of a given type
:: Error creating new cert
:: too many certificates already issued for exact set of domains: test.com www.test.com
Code language: PHP (php)
이 메세지가 무엇일까 확인해 보니, Let’s Encrypt SSL인증서는 5회 발급으로 제한되어 있다고 합니다.
급 당황했는데 다행히 이전에 발급받은 Let’s Encrypt SSL인증서를 백업 받아 놓은 게 있어서 그것으로 대체해 사용해 문제를 풀 수 있었습니다.
서버 세팅 시 서버의 자양한 기능을 충분히 설치 및 테스트해보고, 충분하다싶으면 Let’s Encrypt SSL인증서를 발급받는게 좋을 듯 합니다.
3. 다른 서버에서 인증받은 인증서 사용 가능 여부
그러면 위에서처럼 5번이상 테스트하면서 더 이상 발급이 안된다면 난감하겠죠.
그럴때는 궁여지책으로 이전 서버에서 받은 인증서를 사용할 수 있을까요?
제가 테스트해 본 경우는 가능했습니다.
위에서 설명한대로 5번이 넘어가 더 이상 발급이 불가능해지자 궁여지책으로 이전 서버에서 백업 받았던 Let’s Encrypt SSL 인증서 관련 파일을 새로운 서버에 복사를 했는데요.
- /etc/letsencrypt/live/**.com 아래에 privkey.pem, fullchain.pem, chain.pem, cert.pem의 4개 파일
- /etc/letsencrypt/renewal 아래 **.com.conf 파일
다만 이런 방식은 보안에 문제가 있을 수 있고, 인증 연장등은 제대로 작동하지 않은 불안정한 상태이므로 , 일정 기간이 지나 다시 설치 가능해지면 제대로 발급받는 게 좋습니다.
4. Let’s Encrypt SSL 인증서의 만료일자 확인하기
Let’s Encrypt SSL 인증서는 90일간 유효하기 때문에 90일이 다가기전에 인증서를 연장해야 합니다.
뭐 3개월마다 서버에 접속해 수동으로 연장해주는 것은 서버만 전담으로 담당하는 사람에게는 쉽지만 일반인들에게는 쉽지는 않죠,
그래서 Let’s Encrypt SSL 인증을 자동으로 해주는 방법들이 많이 나왔는데요. 대부분 크론탭 기능을 이용하는 방법입니다.
그런데 이 크론탭이 가끔 작동되지 않는 경우도 있어서 여유를 두고 작동토록 설계가 필요합니다.
Let’s Encrypt SSL 인증서는 한달전부터 인증 연장이 가능하므로 이를 이용해 일주일에 한번씩 체크토록 크론탭을 설정하곤 하죠.
이러는 와중에 도대체 제대로 잘 연장되었을까하는 걱정과 함께 확인을 하고 싶을 때는 아래와 같은 명령으로 확인 가능합니다.
echo | openssl s_client -connect [your-hostname]:443 2>/dev/null | openssl x509 -noout -dates
Code language: PHP (php)
그러면 아래와 같이 단 두줄의 결과가 나옵니다.
notBefore=Jul 23 18:30:10 2018 GMT
notAfter=Oct 21 18:30:10 2018 GMT
Code language: PHP (php)
이를 읽어 보면 아래와 같이 해석할 수 있습니다.
- 2018년 7월 23일에 Let’s Encrypt SSL 인증서가 연장되었으며,
- 2018년 10월 21일까지 Let’s Encrypt SSL 인증서는 유효함
보다 자세한 인증서 정보에 대해서는 아래 글을 참조해 보세요. 인증서 만료일을 비롯한 인증서 정보는 서버뿐만이 아니라, 브라우저나 관련 정보를 제공하는 웹사이트 등 여러가지 방법이 있습니다.
5. Let’s Encrypt SSL 인증서 삭제 방법
Let’s Encrypt SSL 인증서를 다시 제대로 발급받거나 (흔치는 않겠지만) SSL인증을 더 이상 사용하지 않을 경우 인증서를 삭제할 필요가 있습니다.
이럴 경우 아래와 같은 명령어를 사용합니다.
rm -rf /etc/letsencrypt/live/${DOMAIN}
rm -rf /etc/letsencrypt/renewal/${DOMAIN}.conf
rm -rf /etc/letsencrypt/archive/${DOMAIN}
Code language: PHP (php)
6. 인증서 보안 강화 방법
인증서 보안 등급을 강화하는 방법에는 무엇이 있는지 간단히 살펴보죠.
자세한 내용은 아래 글을 참조하면 좋을 것 같습니다.
인증서 보안을 강화하기 위해서는 아래 네가지 정도를 고려해야 합니다.
- Certificate
- Protocol Support
- Key Exchange
- Cipher Strength
6.1. Certificate – Let’s Encrypt 적용만으로 충분
이는 당연히 인증서를 발급받았으므로 문제가 없습니다. 현재 논의하고 있는 Let’s Encrypt 인증서가 발급되었으니 말입니다.
6.2. Protocol Support – 지원 protocol을 제한한다
지원 protocol은 여러 종류가 있지만 점점 보안을 위해서 추천되는 지원 protocol은 한정되어 있습니다.
예전에는 LSv1.2까지는 용인하는 분위기였지만 점점 TLSv1.3만 지원하는 것이 추천되고 있습니다.
호환성 이슈가 있지만 트렌드를 따라오지 못하는 레거시 브라우저는 과감히 포기하라는 것입니다.
6.3. Key Exchange – 보안성이 높은 보안 키 생성 및 적용
일반적으로 2048비트 보안 키를 생성해 적용합니다. 그리고 이정도면 충분하다는 의견도 있습니다.
그러나 근래에는 이 수준으로 변화하는 보안 위협에 충분히 대처하지 못한다는 의견이 많아지면서 4096비트 적용을 많이 추천하는 것으로 보입니다.
이를 위한 명령은 아래와 같습니다. 4096비트다보니 생성 시간이 많이 걸립니다.
mkdir /etc/nginx/ssl
openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096
Code language: PHP (php)
6.4. Cipher 강화
모질라 재단(theMozilla Foundation)에서는 보안과 호환성을 고려한 Cipher 명령을 추천고 있는데요. 이를 활용하는 것이 좋습니다.
여기에서는 nginx, Apache 등의 웹서버 버젼과 OpenSSL버젼 그리고 모던 브라우져 중심인지 아니면 구 부라우져까지 지원할 것인지 옵션에 따라 최적의 세팅 방안을 제안하고 있습니다.
SSL 인증서 관련 참고
최신 Let’s Encrypt SSL 인증서 발급 방법 4가지 정리
Let’s Encrypt SSL 인증서 발급 및 자동 갱신 방법(업데이트)
최신 보안 트렌드를 반영한 Let’s Encrypt 인증서 세팅 방법
웹, 브라우저, 서버에서 SSL 인증서 정보 확인 방법, SSL 인증서 만료일 확인 등
서버 보안 관련
랜섬웨어 대응, 서버 및 워드프레스 필수 보안 설정 15가지
리눅스 서버 root 사용 중지로 리눅스 서버 보안 강화하기
우분투 서버 보안 자동 업데이트 및 업데이트 메일 통보 방법
워드프레스 보안 진단 WPScan 사용법 및 이메일로 결과 받아보기
DDoS 취약 기능 XMLRPC 사용 중지로 워드프레스 보안 강화하기