[Synology] SSL (Wildcard)와일드카드 인증서 받기 (DSM 7.0)

기존 방식으로는 재 갱신이 안되서 다른 방식으로 변경함

왜 안되는지 이유는 잘 모른다. 이런저런 검색으로 통해서 현재 호스팅 하는곳에서 TXT 갱신 관련 자동 업데이트가 안되는 걸로 파악 되었다..

그래서 Cloudflare 에서 DNS 도 무료로 사용 가능해서 hosting.kr 에 DNS 서버 설정을 Cloudflare DNS 로 변경 하였다. (관련 내용은 검색하면 많이 나옴)

그리고 시놀로지도 기존 인증서를 삭제하고 다시 파일 받아서 처음 부터 시작하였다. DDNS 는 기존에 DuckDns.org 를 썼었는데..

DDNS 와 DNS 그리고 와일드 카드 자동 갱신 관련해서 모두 Cloudflare 에서 사용하게 수정 하였다.

아래는 그냥 기록용으로 작성 해본다..


참고사이트

https://github.com/namukcom/SynologyCloudFlareDDNS

https://siane.tistory.com/266

https://jgpark.kr/696

https://blog.uluru.io/nas/1/

https://www.uname.in/78

위 사이트를 참고는 하였는데.. 모든 걸 다 따르기엔 애메한것 들이 많아 중간 중간에 필요한 것 만 썼다..


DNS 설정

cloudflare 에서 도메인 사용하면 이 부분은 패스….

현재 hosting.kr 에 도메인을 쓰고 있어서.. cloudflare dns 서버 사용으로 변경 작업 해야함.

먼저 Cloudflare 사이트 가입한다. 가입방법은 인터넷에 검색..

로그인하여 들어가서 사용하려고 한 도메인 추가한다. 그곳에 dns ns 주소가 있다.

hosting.kr 에 들어가서 dns 설정을 변경하고 해당 주소는 위에 있는 ns 주소로 입력해준다. 관련 내용 인터넷 검색하면 나옴..

참고로 cloudflare dns 설정 하는 곳에 A레코드를 현재 아이피 주소로 매핑 해준다.

(시놀로지 > 제어판 > 외부 액세스 > DDNS 에서 Cloudflare 선택하여 준다 (관련 내용 인터넷 검색)

그리고 아래 처럼 Proxy status 설정 꺼준다.

./acme.sh --install --nocron --home /usr/local/share/acme.sh --accountemail "이메일 입력" --server letsencrypt

cd /usr/local/share/acme.sh

chmod a+x acme.sh

export CF_Key="cloudflare 글로벌 API Key 입력"
export CF_Email="cloudflare 로그인 이메일 입력"
export CERT_DNS="dns_cf"

./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/bin/synosystemctl reload nginx" --dnssleep 20 --force


시놀로지 > 제어판 > 작업스케줄러 등록

# 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/

# copy, 갱신 이후에 다시 점검 해서 아래 내용 필요 없으면 삭제할 예정
# cp /usr/local/share/acme.sh/[도메인주소폴더]/도메인주소명.cer /usr/syno/etc/certificate/_archive/[인증서폴더]/cert.pem
# cp /usr/local/share/acme.sh/[도메인주소폴더]/ca.cer /usr/syno/etc/certificate/_archive/[인증서폴더]/chain.pem
# cp /usr/local/share/acme.sh/[도메인주소폴더]/fullchain.cer /usr/syno/etc/certificate/_archive/[인증서폴더]/fullchain.pem
# cp /usr/local/share/acme.sh/[도메인주소폴더]/도메인주소명.key /usr/syno/etc/certificate/_archive/[인증서폴더]/privkey.pem

# copy default, 갱신 이후에 다시 점검 해서 아래 내용 필요 없으면 삭제할 예정
# cp /usr/local/share/acme.sh/[도메인주소폴더]/도메인주소명.cer /usr/syno/etc/certificate/system/default/cert.pem
# cp /usr/local/share/acme.sh/[도메인주소폴더]/ca.cer /usr/syno/etc/certificate/system/default/chain.pem
# cp /usr/local/share/acme.sh/[도메인주소폴더]/fullchain.cer /usr/syno/etc/certificate/system/default/fullchain.pem
# cp /usr/local/share/acme.sh/[도메인주소폴더]/도메인주소명.key /usr/syno/etc/certificate/system/default/privkey.pem

# 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/bin/synosystemctl 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

cd /usr/local/share/acme.sh
export SYNO_Username='관리자아이디' 
export SYNO_Password='관리자패스워드' 
export SYNO_Scheme="https" #DSM 사용할 프로토콜
export SYNO_Port="5001" #DSM 포트, 기본은 http인경우 5000, https인경우 5001이 됩니다. 본인에 맞게 수정
export SYNO_Certificate="" 
export SYNO_Create=1
./acme.sh --insecure --deploy --home . -d 도메인주소 -d *.도메인주소 --deploy-hook synology_dsm

마지막 부분이 있어야 DSM > 제어판 > 보안 > 인증서 메뉴에서 적용이 된다.

위에 [인증서폴더] 라고 되어 있는 부분은 아래 명령어로 하여 나오는 폴더명을 입력해준다.

 cat /usr/syno/etc/certificate/_archive/DEFAULT

그리고 스케줄은 매일 0시 5분에 실행 되도록 해놨다.


참고 Nginx 서비스 재시작 버전별

# 아래는 DSM 7.0 이전 버전

/usr/syno/sbin/synoservicectl --reload nginx 

# 아래는 DSM 7.0 이후

/usr/syno/bin/synosystemctl reload nginx

아래는 이전 설정 방식.. 지금은 사용 안함 (새로 작성한 내용과 겹치는 부분이 있어 우선 놓아둠)

갱신이 안되 다른 전부다 다 지우고 다시 새로 했다.. 보니 순서가 약간 틀어진듯… 스케줄 돌면서.. ROOT에 정보가 안쌓였다..

/var/services/homes/[홈 폴더] 로 들어가면 acme.sh 파일이 있는데 해당 파일도 삭제, .acme.sh 폴더도 삭제

첨부터 새로 진행 하였다.

정리하자면.. 처음 로그인을 하면 해당 [홈 폴더] 로 위치가 되어있다..

그리고 바로 sudo -i 로 하여 root 로 로그인한다. (그래야 스케줄에서 root 로 실행 가능..)

그리고 밑에 인증서 발급부터 진행한다.


인증서 발급

SSH 프로그램을 통해서 작업을 한다. 시놀로지 SSH 셋팅 관련은 구글링 하면 많이 나온다.

// 루트 권한으로 실행 (sudo su)
// 스크립트 다운로드
wget https://raw.githubusercontent.com/acmesh-official/acme.sh/master/acme.sh

// 권한 설정
chmod a+x acme.sh

// TXT값 받아오기
acme.sh –issue –dns –force -d 도메인 -d *.도메인 –yes-I-know-dns-manual-mode-enough-go-ahead-please –server letsencrypt

// 위 값을 _acme-challenge.도메인 에 txt 값으로 설정해야 함. (2개 모두) : 도메인 사이트에서 해당 값 수정 해야함

// 변경여부 확인 (시간이 조금 걸림)
nslookup

set type=txt
_acme-challenge.도메인

// 변경이 확인되면 인증서 발급
acme.sh –renew –dns –force -d 도메인 -d *.도메인 –yes-I-know-dns-manual-mode-enough-go-ahead-please –server letsencrypt

// 발급이 되면 해당 인증서 다운 받아서 시놀로지에다가 등록 해줘야한다.
.. 이부분은 인터넷에 많음… 생략…


시놀로지 > 제어판 > 작업스케줄러 등록

# 인증서 갱신

/var/services/homes/계정/acme.sh –renew –dns –force -d 도메인 -d *.도메인 –yes-I-know-dns-manual-mode-enough-go-ahead-please –server letsencrypt

# 갱신된 인증서를 시놀로지에 등록

/bin/cp /root/.acme.sh/도메인/도메인.cer /usr/syno/etc/certificate/_archive/[폴더확인]/cert.pem
/bin/cp /root/.acme.sh/도메인/ca.cer /usr/syno/etc/certificate/_archive/[폴더확인]/chain.pem
/bin/cp /root/.acme.sh/도메인/fullchain.cer /usr/syno/etc/certificate/_archive/[폴더확인]/fullchain.pem
/bin/cp /root/.acme.sh/도메인/도메인.key /usr/syno/etc/certificate/_archive/[폴더확인]/privkey.pem

# 기본 인증서 시놀로지 등록

/bin/cp /root/.acme.sh/도메인/도메인.cer /usr/syno/etc/certificate/system/default/cert.pem
/bin/cp /root/.acme.sh/도메인/ca.cer /usr/syno/etc/certificate/system/default/chain.pem
/bin/cp /root/.acme.sh/도메인/fullchain.cer /usr/syno/etc/certificate/system/default/fullchain.pem
/bin/cp /root/.acme.sh/도메인/도메인.key /usr/syno/etc/certificate/system/default/privkey.pem

You may also like...

1 Response

  1. harunice 댓글:

    최고에요👍🏻

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다