본문 바로가기
개발(코딩) 경험 저장소/서버,유틸 설치 및 관리

Let’s Encrypt SSL 무료 인증서 설치

by 주니우스 2022. 3. 27.
반응형

0. 상황

수년동안 손댓다 말았다 하며 만들고있는 소개팅서비스가 있다. 선연(sunyeon.com) 이라고

하지만 앱버전이 없기때문에 아직 정식 서비스라고 할수는 없다.

작년인가는 cafe24에서 인증서를 구매해서 적용했지만, 정식 서비스도 아니고 좀 아까웠다. 

얼마 안되는 금액이지만 선연 서비스 외에도 회사 홈페이지나 간단한 웹을 만들때 종종 쓸거 같아

맘먹고 무료인증서 설치를 추진해봤다.

근데 자료가 많으면서도 전체적으로 필요한 내용을 개별적으로 찾아야 해서 정리해본다.

사실 3개월전에 적용을 했었으나 그때 정리 못해서 다시 갱신 발급하려니 다 까먹어서 이번에도 힘들었다.

 

1. 무료인증서 선정

많은 무료인증서 서비스가 있지만 그중에서 Let’s Encrypt 로 선정

 

2. Let’s Encrypt

Let’s Encrypt 는 비영리재단으로 HTTPS 확산이 유료 서비스에 있다고 보고 여러 글로벌 업체의 후원을 받으며 HTTPS 확산을 위해 무료 SSL인정서 서비스를 진행

단점으로는 90일에 한번씩 재발급을 해야하는데 이는 보안환경 변화를 반영하기 위한 것. 이 단점은 자동갱신 설정으로 해결(?)된다.

 

3. 고민

Let’s Encrypt 를 설치하면서 몇가지 고민을 해야하는 부분들이 있다.

그중 가장 고민 되었던게 설치 방법이다.

우선 설치 방법(도메인 소유자인증)에는 4가지가 있단다. 하지만 실제 설치 시에 선택 가능 내용을 보면 3가지이다.

이 방법중 선택하는 기준의 중요한 부분은, 서버재실행이 필요하냐? 와 단일도메인이냐 여러도메인을 쓸거냐? 

인듯 하다.

 

  1. 웹서버
    - 웹서버(Apache, Nginx) 의 설정을 이용하는것 같다.(잘 모름)
    - 웹서버 일시 중단 불필요.
    - 뭔가 자동으로 되는것들이 많은것 같으나 난 잘 모르겠음
    - 여러 도메인 인증이 가능한듯(?) 이부분 설명을 못본듯 함
  2. webroot 
    - 웹 디렉토리 내에 인증서 유효성을 확인 파일을 업로드하여 인증서를 발급하는 방법
    - 웹서버 일시 중단 불필요
    - 하나의 도메인 인증서만 발급 가능
  1. Standalone
    - 가장 안정적(?)이라고 함
    - 80포트로 가상 웹서버 띄워 인증서발급을 하기 때문에 기존 웹서버를 발급 받는동안 중단해야함.
    - 동시에 여러 도메인을 발급 받을 수 있음

  2. DNS
    - TXT 레코드로 사이트 유효성을 확인
    - 와일드 카드 방식으로 인증서를 발급 가능
    - 자동 인증서 갱신에 DNS 서버의 추가기능이 필요한듯

일단 DNS 방법은 갱신이 좀 복잡해 보여서 제외.

Standalone은 웹서버를 잠시 중단시키고 갱신해야해서 제외.

webroot는 하나의 도메인 인증서만 가능하다는 부분때문에 제외, 직접확인안해봐서 모르겟지만 보통 도메인 사용시

aaa.com 하고 www.aaa.com  하고 두개를 사용해야하기때문에... webroot 방시의 하나의 도메인이라는게 www를 포함하는지 모르겠음.

그래서 웹서버 방식을 이용하고 싶었다.... 싶었다...

 

하지만 Apache 웹서버 방식으로 설치를 하려하다보니 webroot 와 비슷한 문제이기도 하지만~

프레임워크를 이용해 개발된 웹인경우 웹루트 경로가 좀 애매하다. 

시도해보긴 했지만 설치하는 과정에 aaa.com.well-known 이라는 디렉토리 아래 인증파일을 위치해서 발급받아야 하는데... 경로가 안맞아서 자꾸 실패한다. 어떻게든 맞춰볼수도 있을거 같은데 그렇게 하면 사이트마다 적용하기에 왠지 복잡해질것 같아 이방법도 포기 하고 몇시간 동안 방황했다...

 

웹서버 방식과 webroot 방식은 정말 시간 많이 생길때 해보기로 하고

다시 구글링으로 조사해보다 Standalone로 진행하기로 했다.

그 이유는... Standalone 으로 진행할때 가장 걸리던게 웹서버를 중단시키고 갱신시켜야 하고 그러다 보니 자동갱신이 안된다는 것이였는데, 찾아보니 clonetab 과 스크립트로 자동갱신이 가능하다고 함.(몇십초의 서비스 중단은 어쩔수없지만)

 

그래서 Standalone 방식으로 진행하기로 함.

 

실행환경은

Centos8 linux 에 Apache 웹서버, Tomcat9

linux 에 443 포트 방화벽 오픈은 되어있어야 한다.

 

이미 httpd 와 tomcat은 연동이 되어있고 www.sunyeon.com은 정상적으로 웹서비스가 올라가 있는 상태이다.


 

Let’s Encrypt 인증서 설치는 Cerbot 라는 커맨드라인 도구를 사용하기 때문에 우선 EPEL 저장소를 활성화 하기 위해 아래 명령어로 설치한다.

 


1. Cerbot 설치
CentOS의 경우  EPEL 저장소인 epel-release 를 활성 시켜준다.
   shall]$ dnf install epel-release

 

cerbot 을 설치한다.

   shall]$ dnf install certbot

   shall]$ dnf install python3-certbot-apache

 

2. 인증서 발급

설치가 끝나면 아래 명령을 입력하면 바로 인증서 발급을 진행하면 된다.

아래 명령 중에 "certonly"이 없으면 자동으로 여러가지를 하는 경우가 있단다. 서버 관리차원에서 원치않는 변경이 없게

certonly 옵션으로 순수 인증서만 발급한단다.

 

   shall]$ certbot -d sunyeon.com -d www.sunyeon.com certonly

   (주의 : 위 명령은 httpd를 반드시 stop 시키고 해야한다.)

 

1.웹서버  2.standalone  3.webroot  이중에 2번 standalone 를 선택하고 이메일주소 입력하고 내용보면서 선택하고 넘어가면 된다.

(위의 사진에는 없지만 명령실행시 붉은 error 표시가 뜨는 부분은 무시해도 된다.)

 

 

3. 인증서 설정

인증서가 정상적으로 발급이 되면 /etc/letsencrypt/live/sunyeon.com(도메인이름) 경로에 아래와 같이 인증서가 생성이 된다.

 

그리고 /etc/httpd/conf.d 디렉토리 아래에 ssl.conf 라는 파일이 생긴다.

 

ssl.conf 파일 하단에 내용추가. 

위 내용중에 SSLCertificateChinFile 은 chain.pem 을 쓰는 문서도 있고 fullchain.pem 을 쓰는 문서도 있는데..

fullchain.pem 은 cert.pem + chain.pem 이라는데, 내가 해본 경우로는 둘다 되더라. 

 

여기까지 ssl 인증서 발행과 설정은 끝났다.

 

나도 가금 잊어먹고 삽질 하는부분인데 접속 테스트 할때 꼭 공유기에서 SSL 포트 (443) 을 포트포워딩으로 열여주자.


이후 남은 작업은 두가지 인듯 하다.

1. 자동 갱신 실행 등록

2. http로 들어오는 요청을 https로 리다이렉트.

 

 

1. 자동갱신

적당한 곳에 letsencrypt.sh 파일을 생성한다.

나는 /etc/letsencrypt/letsencrypt.sh 로 생성했다.

내용은 

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

#!/bin/sh
systemctl stop httpd
sleep 7
certbot renew
sleep 7
systemctl start httpd

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

라고 입력한다.

위의 내용을 보면 알겠지만 갱신하는 명령은 cerbot renew 이고, 갱신하기전에 httpd 를 stop 시키고

갱신 후에 다시 httpd를 start 시킨다.

 

그리고 위의 파일을 crontab 에 등록 시킨다.

shall]$ crontab -e

아래 내용을 추가한다.

00 05 */80 * * /etc/letsencrypt/letsencrypt.sh

(80일 마다 새벽 5시에 letsencrypt.sh 스크립트 실행 하라는 내용. 이건 잘 되는지 아직 확인 못함)

 

 

2. http -> https 로 리다이렉트

이부분에 시간을 좀 많이 허비했다. 왜냐면 이런걸 해야하는줄 몰랐기때문에~ ;;

이걸 안하면 어떤 현상이 있냐면~~

브라우져에 따라 조금씩 다를 수는 있는데

브라우져에서 https://sunyeon.com 도 되지만 http://sunyeon.com 도 된다는거다.

프로토콜 상관없이 브라우져에 sunyeon.com 이라고 입력했을때

브라우져가 알아서 https로 접속하면 다행이지만 http://sunyeon.com 으로 접속할수도 있고

그런경우에는 브라우져 주소창에 "안전하지 않은 사이트" 가 뜨는거다.

이럴거면 ssl을 적용한 의미가 없는거지~

그래서 브라우져가 또는 일부러 http로 접속을 하려고 하더라도 https로 리다이렉트 시키는거다.

/etc/httpd/conf.d/virtualhost.conf 에 아래 내용을 추가한다.

 

shall]$ vi virtualhost.conf

 

<VirtualHost *:80>
ServerName sunyeon.com
ServerAlias www.sunyeon.com
RewriteEngine On
RewriteCond %{HTTPS} !on
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R,L]
</VirtualHost>

 

이 작업을 마치면 항상 https 로 잘 접속이 된다.

 


인증서 남은 기간 확인

shall]$ certbot certificates

 

인증서 삭제

인증서를 재발행하건 할때 아래 명령으로 인증서를 삭제해야한다.

아래 명령이 아니고 그냥 서버내 인증서 파일 삭제하고 다시 인증서 발행을 하게 되면

이미 도메인으로 발행된 인증서가 Let’s Encrypt 에 등록 되어있기 때문에

도메인 이름 뒤에 0001 이런식의 추가적 이름이 붙어서 발행된다.

shall]$ certbot revoke --cert-path /etc/letsencrypt/archive/sunyeon.com/cert1.pem

 

 

 

도메인 추가

기존 인증서가 있는 상태에서 도메인을 추가할때 아래 명령 처럼 -d 뒤에 도메인을 쭉~ 붙이면 된다.

(아직 나도 안해본 명령)

shall]$ certbot certonly  --cert-name sunyeon.com -d sunyeon.com -d www.sunyeon.com -d........

 

 

우선 설치해본 후에 기억을 더듬고 확인해서 작성한 글이라

혹시 빠진 부분이 있거나 잘못 적은 내용이 있을수도 있겠으나 

나도 다시 인증서 설치할때 보면서 해야하기 때문에 오류가 있으면 그때그때 수정하겠음.

반응형

댓글