2 분 소요

image

2020-06-01 기준 Manual DNS 방법 으로는 renew 가 정상적으로 적용 되지 않습니다.

따라서, 본 글은 Cloudflare DNS 방법으로 서술 하였으며, 반드시 CloudFlare DNS 로 설정이 되어 있어야 합니다.

이 글에서는 CloudFlare DNS 설정 방법은 포함되지 않았으며, 아래 링크에서 확인 가능 합니다.

개인 도메인 클라우드 플레어로 네임서버 변경 : https://blog.uluru.io/cloudflare/1

원문 : https://github.com/Neilpang/acme.sh/wiki/Synology-NAS-Guide

출처 : https://blog.naver.com/clove7802/221703655436

acme.sh 설치

  • 루트 권한으로 로그인 합니다.
      sudo -i
    
  • 홈 디렉토리로 이동 합니다.
      cd ~
    
  • acme.sh 파일을 wget 을 통해 다운로드 받습니다.
      wget https://github.com/Neilpang/acme.sh/archive/master.tar.gz
    
  • 다운받은 tar 압축 해제 합니다.
      tar xvf master.tar.gz
    
  • 압축이 풀린 acme.sh-master 디렉토리로 이동 합니다.
      cd acme.sh-master
    
  • acme.sh 를 설치 합니다.

  • 이메일로 표시 된 부분은 본인의 이메일을 입력

  • ※ 2021.08.14 수정 ( default 가 letsencrypt -> zerossl 로 변경됨에 따라 2021.07년 이후 acme.sh를 새로 설치 후 이용 시 –server letsencrypt 옵션 추가.
      ./acme.sh --install --nocron --home /usr/local/share/acme.sh --accountemail "이메일" --server letsencrypt
    

    image

acme.sh로 인증서 발급 및 등록

  • Cloudflare 글로벌 키가 필요하므로 https://dash.cloudflare.com/profile/api-tokens 에서 [API Tokens > View] 클릭 하여 글로벌 키를 확인 합니다. image

  • acme.sh 이 설치 된 디렉토리로 이동합니다.
      cd /usr/local/share/acme.sh
    
  • 해당 경로에서 환경변수를 등록 합니다.
      export CF_Key="글로벌 API 키" 
      export CF_Email="이메일" 
      export CERT_DNS="dns_cf"
    
  • 아래 명령어를 통하여 인증서를 등록 및 교체 합니다.

  • 도메인으로 표시 된 부분은 본인의 도메인을 입력 (ex: *.uluru.io, uluru.io)

  • WebRoot 인증 이기 때문에 반드시 외부에서 해당 도메인으로 80 port 접근이 가능 해야 합니다.
      ./acme.sh --issue -d *.도메인 -d 도메인 --dns $CERT_DNS --cert-file /usr/syno/etc/certificate/system/default/cert.pem --key-file /usr/syno/etc/certificate/system/default/privkey.pem --fullchain-file /usr/syno/etc/certificate/system/default/fullchain.pem --reloadcmd "/usr/syno/sbin/synoservicectl --reload nginx" --dnssleep 30 --force --server letsencrypt
      # Please refer to https://curl.haxx.se/libcurl/c/libcurl-errors.html for error code: 60 오류 발생 시 https://blog.uluru.io/nas/2 참조
    

    image

  • 만일, 위의 과정대로 진행 하여도 기본 인증서가 새로 발급 한 인증서로 교체 되지 않았다면

  • 아래 과정을 따라해주시면 되고, 정상적으로 인증서가 교체 되었다면 아래 과정은 패스 하셔도 됩니다.
      export CERT_FOLDER="$(find /usr/syno/etc/certificate/_archive/ -maxdepth 1 -mindepth 1 -type d)"
      export CERT_DNS="dns_cf"
    
      ./acme.sh --issue -d *.도메인 -d 도메인 --dns "$CERT_DNS" --cert-file "$CERT_FOLDER/cert.pem" --key-file "$CERT_FOLDER/privkey.pem" --fullchain-file "$CERT_FOLDER/fullchain.pem" --capath "$CERT_FOLDER/chain.pem" --reloadcmd "/usr/syno/sbin/synoservicectl --reload nginx" --dnssleep 30 --force --server letsencrypt
    

    image

인증서 자동 갱신 스케줄러 등록

  • [제어판 > 작업 스케줄러 > 생성 > 예약된 작업 > 사용자 정의 스크립트] 순으로 들어 갑니다. image

  • 일반 탭에서는 작업이름은 영어로 원하는대로 작성 해주시면 됩니다.

  • 스케줄 탭에서는 현재 날짜 +1개월 부터 하여 매월 반복 해주시면 됩니다. image

  • 작업 설정에서는 아래의 스크립트를 작성해주시면 됩니다.

      # Note: The $CERT_FOLDER must be hardcoded here since the running environment is unknown. Don't blindly copy&paste!
      # if you used the normal method the certificate will be installed in the system/default directory CERTDIR="system/default"
      # if you used the alternative method it is copied to an unknown path, change the following example to the output of the creation process and uncomment.
      CERTDIR="system/default"
    
      # do not change anything beyond this line!
      CERTROOTDIR="/usr/syno/etc/certificate"
      PACKAGECERTROOTDIR="/usr/local/etc/certificate"
      FULLCERTDIR="$CERTROOTDIR/$CERTDIR"
    
      # renew certificates, this used to be explained as a custom cronjob but works just as well within this script according to the output of the task.
      /usr/local/share/acme.sh/acme.sh --cron --home /usr/local/share/acme.sh/
    
      # find all subdirectories containing cert.pem files
      PEMFILES=$(find $CERTROOTDIR -name cert.pem)
      if [ ! -z "$PEMFILES" ]; then
              for DIR in $PEMFILES; do
                      # replace the certificates, but never the ones in the _archive folders as those are all the unique
                      # certificates on the system.
                      if [[ $DIR != *"/_archive/"* ]]; then
                              rsync -avh "$FULLCERTDIR/" "$(dirname $DIR)/"
                      fi
              done
      fi
    
      # reload
      /usr/syno/sbin/synoservicectl --reload nginx
    
      # update and restart all installed packages
      PEMFILES=$(find $PACKAGECERTROOTDIR -name cert.pem)
      if [ ! -z "$PEMFILES" ]; then
              for DIR in $PEMFILES; do
                      #active directory has it's own certificate so we do not update that package
                      if [[ $DIR != *"/ActiveDirectoryServer/"* ]]; then
                              rsync -avh "$FULLCERTDIR/" "$(dirname $DIR)/"
                              /usr/syno/bin/synopkg restart $(echo $DIR | awk -F/ '{print $6}')
                      fi
              done
      fi
    

    image