[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
위 사이트를 참고는 하였는데.. 모든 걸 다 따르기엔 애메한것 들이 많아 중간 중간에 필요한 것 만 썼다..
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-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
최고에요👍🏻