ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시놀로지 NAS, Let's Encrypt WildCard SSL 적용기-2
    Archive/설치-세팅 2020. 12. 14. 16:19

    2021-05-06 재작성 [시놀로지 NAS, Let's Encrypt 와일드카드(WildCard) SSL 인증서 적용기-3]

    시놀로지 DS218+ DSM 6.2, DNSZi, DuckDNS, ACME.SH case 입니다.

     

    1. DNSZi의 DNS서버를 사용중인데, DNSZi는 txt 키/값을 등록하는 API를 지원하지 않아서(2018년 9월 경 내부논의 중이라는 답변 게시물을 확인) DuckDNS를 CNAME Alias하여 사용합니다. 또는 CloudFlare를 사용하는 방법은 검토 중입니다.

     

    2. DuckDNS 가입 및 Token 값

    (예시) aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee

    3. DNSZi 의 CNAME 등록

    (예시)
    CNAME : _acme-challenge.eunpoong.com 
    목적지 도메인 : _acme-challenge.eunpoong.duckdns.org

    4. on Synology NAS

     

    # ACME.SH 설치 

    # NAS 사용자 계정으로 SSH 접속 후
    # 관리자 계정 접속
    # sudo -i
    
    # ACME.SH 다운로드
    # git clone https://github.com/acmesh-official/acme.sh.git
    
    # 경로 이동 및 ACME.SH 설치
    # cd acme.sh
    # ./acme.sh --install --nocron --home /usr/local/share/acme.sh --accountemail "이메일주소"
      
    # 설치 후 다운로드 파일 제거
    # cd ..
    # rm -rf acme.sh
    

     

    ##################################################

    # 스크립트 실행 시 acme.sh 실행 파일에 대하여

    # permission 에러가 발생할 경우 sudo 명령어로 테스트 가능합니다.

    ##################################################

     

    # 인증서 발급 테스트

    - 실제 인증서 발급 전 테스트 진행

    # issue-test.sh - 인증서 발급 테스트
    
    export DuckDNS_Token="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
    
    /usr/local/share/acme.sh/acme.sh --insecure --issue --force --test \
    	--dns dns_duckdns --challenge-alias eunpoong.duckdns.org \
    	-d *.eunpoong.com \
    	--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"
    

     

    # 실제 인증서 발급

    # issue.sh - 인증서 발급
    
    export DuckDNS_Token="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
    
    /usr/local/share/acme.sh/acme.sh --insecure --issue --force \
    	--dns dns_duckdns --challenge-alias eunpoong.duckdns.org \
    	-d *.eunpoong.com \
    	--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"
    

     

    # 발급된 인증서로 Synolog NAS의 인증서를 교체

    # replace.sh - 인증서 교체
    
    CERTROOTDIR="/usr/syno/etc/certificate"
    CERTDIR="system/default"
    PACKAGECERTROOTDIR="/usr/local/etc/certificate"
    FULLCERTDIR="$CERTROOTDIR/$CERTDIR"
    
    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
    
    /usr/syno/sbin/synoservicectl --reload nginx
    
    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
    

     

     

    # 작업 스케쥴러 등록

    - 인증서 갱신 및 서비스 별 인증서 파일 교체

    - root 계정으로 실행하도록 스케쥴러 생성

    # update.sh - 인증서 갱신 및 교체
    
    CERTROOTDIR="/usr/syno/etc/certificate"
    CERTDIR="system/default"
    PACKAGECERTROOTDIR="/usr/local/etc/certificate"
    FULLCERTDIR="$CERTROOTDIR/$CERTDIR"
    
    /usr/local/share/acme.sh/acme.sh --cron --force --home /usr/local/share/acme.sh/
    
    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
    
    /usr/syno/sbin/synoservicectl --reload nginx
    
    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

    작성일 기준 발급된 SSL인증서

     

     

    # 이슈사항

    1. 도메인을 두 개(예시, -d eunpoong.com -d *.eunpoong.com) 등록하면 txt값 확인이 제대로 진행되지 않아 hang걸림, -d *.eunpoong.com 한개 도메인만 발급 시 진행 가능

     

    반응형

    댓글 0

Designed by Tistory.