시놀로지 기본 인증서 외부 인증서로 자동 교체 하기

서론

최근에 이것저것 서버를 만지다 인증서 구조를 좀 바꾸고 스크립트도 지워놓고 귀찮아서 방치했더니, 기존에 먹여놨던 인증서가 만료가 되었습니다.

예전에 시놀로지 내에서 acme를 통해 Let’s Encrypt 인증서 발급, 자동 갱신, 적용되게 만드는 방법을 포스팅 했었는데, 블로그도 여차저차 문제가 많았다보니 지워졌고 새로 쓰진 않은 상태네요.

본론

현재 인증서는 Nginx Proxy Manager라는 리버스 프록시 관리 서비스에서 관리되고 있으며, 자동으로 갱신되는 서비스도 자체적으로 내장되어 있어서 등록만 하면 신경 끄고 써도 되는 아주 편리한 물건입니다.

여튼, 인증서가 시놀로지 외부에 있기 때문에, 인증서를 서버에서 Rsync로 시놀로지로 전송. 시놀로지에서는 주기적으로 스크립트를 구동하여, 인증서의 변화(업데이트)가 감지되면 자동으로 인증서를 교체하게 만드는것 까지 해보도록 하겠습니다.

시놀로지 인증서를 한번이라도 만져보셨으면 시놀로지의 기본 인증서가 랜덤ID로 지정된 디렉터리 안에 위치한다는것을 아실겁니다.

이 아이디는 /usr/syno/etc/certificate/_archive/DEFAULT라는 파일 안에 적혀있습니다.

그리고 서버측 인증서 위치도 파악해 둬야겠죠. 제 경우에는 홈/도커/서비스/~~/인증서 위치에 있습니다.

Nginx Proxy Manager(줄여서NPM)은 인증서를 한번 등록해두면 디렉터리가 바뀌지는 않고, 내부 인증서만 변경되기에 저 위치를 그대로 사용하면 됩니다. 나중에 변동이 있을때만 스크립트를 조금 손보면 되겠죠.

스크립트 제작

#!/bin/bash

SRC_DIR="/home/clove7802/docker/npmplus/data/tls/certbot/archive/npm-5"
FILES=("cert.pem" "privkey.pem" "fullchain.pem")

REMOTE_USER="유저"
REMOTE_HOST="시놀로지"
REMOTE_PORT=포트
REMOTE_DIR="인증서 저장위치"

for FILE in "${FILES[@]}"; do
  SRC_FILE="$SRC_DIR/$FILE"
  if [ -f "$SRC_FILE" ]; then
    rsync -av -e "ssh -p $REMOTE_PORT" "$SRC_FILE" "${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_DIR}/"
    echo "[`date`] Synced: $FILE"
  else
    echo "[`date`] Not found: $FILE"
  fi
done
Bash

일단 서버측에서 전송을 하기 위한 스크립트를 먼저 작성했습니다.

그대로 넣으시면 안되고 사용 환경에따라 값들이 달라지기 때문에 적당히 수정해서 사용하시면 되겠습니다.

인증서 디렉터리에서 필요한 3개의 파일을 Rsync로 전송하는 스크립트 입니다.

저는 cron에 등록해서 주기적으로 작동되게 할 예정입니다.

cron은 사용자 입력을 받을 수가 없기 때문에 SSH 비밀번호를 입력할 수 없습니다. 저처럼 cron을 사용할 예정이라면, 미리 SSH-Key를 생성해서 시놀로지에 등록해서 비밀번호 없이 키만으로 접속이 가능하게 해두시는걸 추천드립니다.

#!/bin/bash

#기본 인증서 디렉토리 ID 읽기, 디렉터리 지정
DEFAULT_ID=$(cat /usr/syno/etc/certificate/_archive/DEFAULT)
CERT_DIR="/usr/syno/etc/certificate/_archive/${DEFAULT_ID}"
NEW_CERT_DIR="인증서 저장위치"
CHECKSUM_FILE="${NEW_CERT_DIR}/.cert_checksum"

#인증서 해시 계산
current_checksum=$(sha256sum "$NEW_CERT_DIR/cert.pem" "$NEW_CERT_DIR/fullchain.pem" "$NEW_CERT_DIR/privkey.pem" | sha256sum | awk '{print $1}')

#이전 해시 불러오기
if [ -f "$CHECKSUM_FILE" ]; then
    old_checksum=$(cat "$CHECKSUM_FILE")
else
    old_checksum=""
fi

#비교 및 처리
if [ "$current_checksum" != "$old_checksum" ]; then
    echo "인증서 변화 감지됨"

    cp -f "$NEW_CERT_DIR/cert.pem" "$CERT_DIR/cert.pem"
    cp -f "$NEW_CERT_DIR/fullchain.pem" "$CERT_DIR/fullchain.pem"
    cp -f "$NEW_CERT_DIR/privkey.pem" "$CERT_DIR/privkey.pem"

    #기본 권한으로 변경
    chmod 400 "$CERT_DIR"/*

    #서비스 재시작
    synosystemctl reload nginx

    # 새 해시값 저장
    echo "$current_checksum" > "$CHECKSUM_FILE"
else
    echo "인증서 변화 없음"
fi
Bash

다음으로 시놀로지 작업 스케줄러에 등록할 스크립트를 만들었습니다.

스크립트가 실행되면 인증서 파일 3개의 해시를 추출하고 그 3개의 해시를 다시 해시하여 하나의 파일이라도 변화가 생기면 감지 되도록 되어있습니다.

변화가 감지되면 시놀로지 기본 인증서 디렉터리에 인증서를 덮어쓰고, 권한을 기본권한대로 400으로 설정한 뒤 시놀로지 웹 서비스를 재시작하게 되어있습니다.

결과 확인

시놀로지 작업 스케줄에 앞에서 생성한 업데이트 스크립트를 등록하면 됩니다.

시스템 파일을 수정해야 하기 때문에 사용자는 root로 지정해주셔야 하고, 스케줄은 편하신대로 (저는 매일), 그리고 실행 명령에는 생성한 스크립트를 지정해주면 됩니다.

서버측에서 스크립트를 실행했을때 결과. 문제없이 인증서 파일들이 전송되었습니다.

시놀로지에서 스크립트를 실행했을때의 결과. 별 다른 오류 없이 전송이 되었고, 서비스 재시작도 문제 없이 완료.

이제 DSM에서 인증서를 확인 해보면 정상적으로 교체된걸 확인할 수 있습니다.

끝.

답글 남기기

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