ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 시놀로지 NAS, Let's Encrypt 와일드카드(WildCard) SSL 인증서 적용기-3
    Archive/설치-세팅 2021. 5. 6. 13:57

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

     

    기존 포스팅[2020.12.14 - [Dev./설치&세팅] - 시놀로지 NAS, Let's Encrypt WildCard SSL 적용기-2]에서는 DuckDNS를 이용한 와일드카드 인증서 발급 및 자동 갱신을 설정하였으나, 발급대상을 *.eunpoong.com으로 했기 때문에 서브도메인 이슈는 없으나 root 도메인에 대한 인증서 validation 이슈가 있어서 dns challenge를 변경함

     

    1. ACME.SH 설치

    2. acme-dns에 register하여 고유키, 계정, 비번을 획득

    3. CNAME 등록

    4. 스케쥴러로 issue / renew 시 시놀로지 NAS에 변경된 인증서 적용

     

     

     

    1. ACME.SH 설치 on Synology NAS

    # 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
    

     

    2. ACME-DNS register

    $ curl -X POST https://auth.acme-dns.io/register
    
    {
      "username":"c36f50e8-4632-44f0-83fe-e070fef28a10",
      "password":"htB9mR9DYgcu9bX_afHF62erXaH2TS7bg9KW3F7Z",
      "fulldomain":"8e5700ea-a4bf-41c7-8a77-e990661dcc6a.auth.acme-dns.io",
      "subdomain":"8e5700ea-a4bf-41c7-8a77-e990661dcc6a",
      "allowfrom":[]
     }

     

    3. 이용중인 DNS 서비스에서 CNAME 등록

    _acme-challenge.eunpoong.com  ->  8e5700ea-a4bf-41c7-8a77-e990661dcc6a.auth.acme-dns.io

     

    3. 인증서 발급 command

    export ACMEDNS_UPDATE_URL="https://auth.acme-dns.io/update"
    export ACMEDNS_USERNAME="c36f50e8-4632-44f0-83fe-e070fef28a10"
    export ACMEDNS_PASSWORD="htB9mR9DYgcu9bX_afHF62erXaH2TS7bg9KW3F7Z"
    export ACMEDNS_SUBDOMAIN="8e5700ea-a4bf-41c7-8a77-e990661dcc6a"
    
    /usr/local/share/acme.sh/acme.sh --issue --force \
    	--dns dns_acmedns \
    	-d eunpoong.com -d *.eunpoong.com \
    	--cert-file /usr/syno/etc/certificate/system/default/cert.pem \
    	--key-file /usr/syno/etc/certificate/system/default/privkey.pem \
    	--ca-file /usr/syno/etc/certificate/system/default/chain.pem \
    	--fullchain-file /usr/syno/etc/certificate/system/default/fullchain.pem \
    	--reloadcmd "/usr/syno/sbin/synoservicectl --reload nginx"

     

    4. 인증서 적용 command

    CERTROOTDIR="/usr/syno/etc/certificate"
    CERTDIR="system/default"
    PACKAGECERTROOTDIR="/usr/local/etc/certificate"
    FULLCERTDIR="$CERTROOTDIR/$CERTDIR"
    
    DEFAULT=$(cat $CERTROOTDIR/_archive/DEFAULT)
    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
            if [[ $DIR == *"/_archive/"* ]] && [[ $DIR != *"/_archive/$DEFAULT/"* ]]; then
                 continue
            fi
            rsync -avh "$FULLCERTDIR/" "$(dirname $DIR)/"
        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

     

    5. 인증서 갱신 command

    export ACMEDNS_UPDATE_URL="https://auth.acme-dns.io/update"
    export ACMEDNS_USERNAME="c36f50e8-4632-44f0-83fe-e070fef28a10"
    export ACMEDNS_PASSWORD="htB9mR9DYgcu9bX_afHF62erXaH2TS7bg9KW3F7Z"
    export ACMEDNS_SUBDOMAIN="8e5700ea-a4bf-41c7-8a77-e990661dcc6a"
    
    /usr/local/share/acme.sh/acme.sh --renew --force --dns dns_acmedns \
    	--dns dns_acmedns \
    	-d eunpoong.com -d *.eunpoong.com \
    	--cert-file /usr/syno/etc/certificate/system/default/cert.pem \
    	--key-file /usr/syno/etc/certificate/system/default/privkey.pem \
    	--ca-file /usr/syno/etc/certificate/system/default/chain.pem \
    	--fullchain-file /usr/syno/etc/certificate/system/default/fullchain.pem \
    	--reloadcmd "/usr/syno/sbin/synoservicectl --reload nginx"

     

    6. NAS 제어판 > 작업 스케줄러에서 root 계정으로 실행하도록 스케줄러 생성

     

     

     

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

    반응형

    댓글 9

    • KimPig 2021.05.28 10:24

      안녕하세요, 자세한 적용 글 감사합니다.
      다만 조금 문제가 생겨 질문드립니다.

      저는 도메인을 두개 사용중이라 위 커맨드를 쓰면 안될것 같아서,
      발급받은 인증서를 /usr/syno/etc/certicifate/_archive 와 system 폴더 안에 붙여넣도록 해놨는데,
      시놀로지 제어판 안에서는 제대로 갱신된 걸로 보이는데, 실제로 사이트에 접속하여 인증서 정보를 살펴보면 갱신되지 않고 예전 날짜로 나오네요. 혹시 제가 어디 잘못한게 있을까요?



    • Karma 2021.07.03 22:30

      안녕하세요... 시놀로지 NAS를 운영하기 시작한 초보입니다 ㅠㅠ

      제가 duckdns를 쓰고있어 2탄 올리신 글 보고 적용했는데
      Verify error:DNS problem: NXDOMAIN looking up TXT for _acme-challenge.xxx.com - check that a DNS record exists for this domain

      에러가 떠서요 3탄을 보고 따라하려고 합니다.

      3탄을 보고 궁금해졌는데요, 3탄 방식대로 하면 ddns는 어떻게 되는건가요?

      • 은풍 2021.07.03 22:48 신고

        3탄 방식으로 진행하실 경우,
        cname : _acme-challenge.xxx.com 을
        "3. 이용중인 DNS 서비스에서 CNAME 등록"에 있는 것처럼 acme-dns.io에서 register해서 발급받은 fulldomain으로 연결하시면 됩니다

    • Karma 2021.07.04 10:41

      빠르고 친절한 답변 감사드립니다 선생님. 이해가 부족해서 더 여쭤보겠습니다. 그렇다면 acme-dns.io에서 발급받은 fulldomain이 DDNS 기능을 하는건가요?! 아니면 DNSZi에서 제공하는 DDNS기능을 활용하라는 말씀이신가요?

      • 은풍 2021.07.04 10:58 신고

        DNS 챌린지는 도메인의 TXT 레코드에 특정 값을 넣어 DNS를 증명하는 방식입니다
        이때 '검증'하는 dns 레코드가 _acme-challenge.도메인네임(ex. _acme-challenge.xxx.com, 이하 "_acme~")입니다. 이 "_acme~" txt 레코드에 특정 값을 넣고, 그 값을 체크하여 확인된다면 올바른 도메인 관리자(?)니깐 인증서를 발급해준다 라고 러프하게 생각할 수 있습니다

        acme.sh 에서 dns 챌린지 방식으로 진행하면 "_acme~"에서 txt 값을 세팅하고 체크를 하는데 DNSZi dns를 사용한다면, 사이트에 들어가서 수동으로 설정할 순 있지만 api 방식으로 세팅할 수 없습니다.

        그래서 "_acme~"를 cname으로 txt값을 설정할수 있는 다른 dns(acme-dns, duckdns 등)에 '연결'해서, dns 챌린지로 txt 값을 설정 또는 체크 할때 "_acme~"에 연결된 ~~~.acme-dns.io 에 저장되는 txt값을 확인하도록 해야합니다.

        그러니깐 DNSZi를 dns서버로 사용하신다면, dnszi 사이트의 cname에
        "_acme~" 를 ~~~.acme-dns.io 로 연결하셔야겠죠

    • Karma 2021.07.04 11:10

      친절한 답변 다시 감사합니다 선생님. 근데 3탄을 진행중에 Unknown parameter : --sa-file 모르는 파라미터라고 뜨는데 어떻게 해야하나요ㅠㅠ?

    • Karma 2021.07.04 11:38

      인증서 발급 command 단계에서 막히네요... 모두 제대로 입력했는데도 불구하고, txt records 두 개를 주면서

      Checking [저의DNSZi도메인].com for -acme_challenge.[저의DNSZi도메인].com
      Not valid yet, let's wait 10 seconds and check next one.
      Let's wait 10 seconds and check again

      이 무한으로 뜹니다 ㅠㅠ 도와주세요 ㅠㅠ

      • 은풍 2021.07.04 12:04 신고

        도메인과 연결된 네임서버, cname 설정, cname돠 acme-dns의 fulldomain 연결, acme-dns에 txt가 잘 설정됐는지 등 nslookup 등으로 단계별로 체크해보세요

Designed by Tistory.