letsencrypt(certbot) 설치 및 사용

#!/bin/bash
#####################################################################
#
# Let's Encrypt 인증서 설치 스크립트
#
# https://letsencrypt.org/ko/
#
#####################################################################

#####################################################################
# Let's encrypt로 SSL 인증서 받는 4가지 방법
#
# ■webroot: 사이트 디렉토리 내에 인증서 유효성을 확인할 수 있는 파일을 업로드하여 인증서를 발급하는 방법
# - 실제 작동하고 있는 웹서버의 특정 데렉토리의 특정 파일 쓰기 작업을 통해서 인증
# - 이 방식의 장점은 nginx를 중단시킬 필요가 없음.
# - 이 방법의 단점은 인증 명령에 하나의 도메인 인증서만 발급 가능
# ■웹서버
# - Nginx나 아파치와 같은 웹서버에서 직접 SSL 인증을 실시하고 웹서버에 맞는 SSL세팅값을 부여
# - 발급이나 갱신을 위해 웹서버를 중단시킬 필요가 없음
# - 인증서 갱신 시 상황에 맞게 세팅을 자동으로 업데이트
# - 사용자가 세팅을 변경할 수 있지만 자동 업데이트 시 반영되지는 않음
# ■standalone: 사이트 작동을 멈추고 이 사이트의 네크워킹을 이용해 사이트 유효성을 확인해 Let’s Encrypt SSL 인증서를 발급하는 방식
# - 80포트로 가상 staandalone 웹서버를 띄워 인증서를 발급
# - 이 방식은 동시에 여러 도메인을 발급 받을 수 있음
# - 그렇지만 인증서 발급 전에 Nginx를 중단하고 발급 완료 후 다시 Nginx를 시작해야 함
# ■DNS: 도메인을 쿼리해 확인되는 TXT 레코드로 사이트 유효성을 확인하는 방법
# - 와일드 카드 방식으로 인증서를 발급 가능
# - 이 방법은 당연하게도 서버 관리자가 도메인 DNS를 관리/수정할 수 있어야 하며
# - 인증서 갱신 시마다 DNS에서 TXT값을 변경해야 하므로
# - 외부에서 TXT 레코드를 입력할 수 있도록 DNS가 API를 제공하는 경우만 갱신 과정을 자동으로 처리(클라우드 플레어 API가 대표적인 사례)
#####################################################################

MY_DOMAIN="esvali.com"
MY_EMAIL="esecuvali@gmail.com"
MY_DOMAIN_LIST="${MY_DOMAIN},www.${MY_DOMAIN},imap.${MY_DOMAIN},smtp.${MY_DOMAIN},tech.${MY_DOMAIN},mail.${MY_DOMAIN},pop.${MY_DOMAIN}"

#####################################################################
# 관련 패키지를 설치 한다.
#####################################################################
function install_centos() {
  yum -y install yum-utils epel-release
  yum -y install python-pip
  # pip install --upgrade pip
  # pip install cryptography --upgrade
  # pip install pyopenssl
  yum -y install certbot python2-certbot-apache mod_ssl
}

#####################################################################
# 인증서를 발급한다.
#
# certonly: 웹서버의 설정파일은 건들지 않고 인증서만 발급한다.
# --standalone: 자체 웹서버로 도메인에 대한 인증을 한다.
# -d: 사용할 도메인을 나열한다.
#
# 설치된 인증서는 /etc/letsencrypt/archive/${MY_DOMAIN}에 설치되고
# /etc/letsencrypt/live/${MY_DOMAIN}으로 인덱싱 된다.
#####################################################################
function install_cert() {
  if [ ! -d ebroot ]; then
    mkdir ebroot
  fi

  # standalone 방식은 자체 80포트로 통신하기 때문에 외부에서 80 포트로 들어올 수 있어야 한다.
  systemctl stop httpd
  rm -rf /etc/letsencrypt
  rm -rf /var/log/letsencrypt
  certbot \
certonly \
--standalone \
--non-interactive \
--agree-tos \
--register-unsafely-without-email \
-d ${MY_DOMAIN_LIST}
  systemctl start httpd
}

#####################################################################
# config 파일 생성
#####################################################################
function make_conf() {
  echo "archive_dir = /etc/letsencrypt/archive/${MY_DOMAIN}" > /etc/letsencrypt/renewal/${MY_DOMAIN}.conf
  echo "cert = /etc/letsencrypt/live/${MY_DOMAIN}/cert.pem" >> /etc/letsencrypt/renewal/${MY_DOMAIN}.conf
  echo "privkey = /etc/letsencrypt/live/${MY_DOMAIN}/privkey.pem" >> /etc/letsencrypt/renewal/${MY_DOMAIN}.conf
  echo "chain = /etc/letsencrypt/live/${MY_DOMAIN}/chain.pem" >> /etc/letsencrypt/renewal/${MY_DOMAIN}.conf
  echo "fullchain = /etc/letsencrypt/live/${MY_DOMAIN}/fullchain.pem" >> /etc/letsencrypt/renewal/${MY_DOMAIN}.conf
}

#####################################################################
# 인증서를 삭제한다.
#####################################################################
function remove_cert() {
  certbot delete --cert-name "${MY_DOMAIN}"
  rm -rf /var/log/letsencrypt/*
}

#####################################################################
# 인증서를 갱신한다.
#####################################################################
function renew_cert() {
  RETVAL=$(certbot certificates | grep "EXPIRED")
  if [ $? == 0 ]
  then
    certbot --standalone renew
    systemctl reload httpd
    systemctl reload postfix
    systemctl reload dovecot
  else
    echo "valid"
  fi
}

#####################################################################
# 현재 설치되어 있는 인증서를 확인
#####################################################################
function view_cert() {
  certbot certificates
}

#####################################################################
# 현재 설치되어 있는 인증서의 정상여부 확인
#####################################################################
function test_cert() {
  certbot renew -dry-run
}

#####################################################################
# main
#####################################################################
case "$1" in
  install)
    remove_cert
    make_conf
    install_cert
    ;;
  remove)
    remove_cert
    ;;
  renew)
    renew_cert
    ;;
  view)
    view_cert
    test_cert
    ;;
  yum)
    install_centos
    ;;
  *)
    echo "Usage: $0 install|remove|renew|view|yum" >&2
    exit 1
    ;;
esac
위로 스크롤