TrueNAS에서 Let's Encrypt로 SSL 인증서 발급하기

병신·2023년 1월 14일

개요

TrueNAS는 자체적으로 CA 사설 인증서를 만들거나 상용 인증서를 가져와 https 프로토콜을 사용하는 기능을 가지고 있었습니다. 이는 일반적으로 사용할 디바이스에 신뢰 인증서를 추가하거나 상용 인증서에 대한 비용을 지불해야 함을 의미했습니다.

이 포스트에서는 사용자에게 무료로 TLS 인증서를 발급해주는 비영리기관인 Let's Encrypt을 사용해 자동으로 SSL 인증서를 갱신하는 방법에 대해 설명합니다. 트루나스에서 사용하고있는 서비스에 적용을 편리하게 할 수 있도록 도와주는 deploy-freenas 또한 함께 설명합니다.

발급 방법

CloudFlare API KEY로 발급하는 방법

이 문서에서 인증서 발급은 .acme.sh의 CloudFlare DNS API를 사용합니다.
먼저 아래 쉘 명령어를 루트 계정에서 실행하여 .acme.sh를 다운로드 합니다.

curl https://get.acme.sh | sh -s email=이메일@이메일주소.com
export CF_Key="---"
export CF_Email="이메일@이메일주소.com"

CF_Key는 https://dash.cloudflare.com/profile/api-tokens에서 필요한 권한을 가진 api token을 발급하거나 global api key를 복사해 입력합니다. 추가적인 발급 옵션은 https://github.com/acmesh-official/acme.sh/wiki/dnsapi를 참고해 주세요.

이후 아래 방법으로 인증서를 발급합니다.

.acme.sh/acme.sh --issue -d (사용할도메인.com) --dns dns_cf

Zone ID로 발급하는 방법

저같은 경우는 앞의 명령어로 발급이 불가능해서 클라우드플레어 zone id를 사용한 방법으로 발급합니다. nano ~/.acme.sh/account.conf로 클라우드 플레어 환경변수를 모두 지우고 실행 해 주세요.

https://dash.cloudflare.com/profile/api-tokens 링크 입장후 => Create Token 버튼 클릭 => Edit zone DNS 템플릿을 이용해 만들어 줍니다.

발급되는 토큰을 아래 명령어로 쉘의 환경변수에 입력 해 주세요.

export CF_Token="-"

또한 다음 명령어로 각각 Zone ID와 Account ID를 획득합니다.

curl -X GET "https://api.cloudflare.com/client/v4/zones"  -H "Authorization: Bearer $CF_Token" | jq '.result[0].id'
curl -X GET "https://api.cloudflare.com/client/v4/zones"  -H "Authorization: Bearer $CF_Token" | jq '.result[0].account.id'

가져온 값을 아래와 같은 방법으로 환경변수로 세팅 해 주세요.

export CF_Account_ID="-"
export CF_Zone_ID="-"

이후 다시 발급 명령어를 실행합니다.

.acme.sh/acme.sh --issue -d (사용할도메인.com) --dns dns_cf

배포 방법

deploy-freenas

서비스에 인증서를 자동 배포하기 위해 파이썬 스크립트 deploy-freenas 스크립트를 받고, .acme.sh 배포 프로그램에서 사용 가능하도록 권한을 재설정합니다. 설치 경로는 풀의 메인 데이터셋이나 /root/와같이 편한 장소에서 설치합니다.
저는 /root/에 설치했습니다.

cd /root
.git clone https://github.com/danb35/deploy-freenas
sudo chmod -R 755 ./deploy-freenas

스크립트를 받은 뒤 설정 예시파일을 실제 설정파일로 사용하고, 설정에서 필요한 부분만 수정합니다.

mv deploy_config.example deploy_config
nano deploy-freenas/deploy_config

내용물의 deploy_config.example 파일에서 password로 시작하는 라인을 주석처리하고 api_key를 주석 해제한 뒤 패스워드를 입력합니다. API키는 트루나스 Web UI의 우상단 헤더 설정아이콘의 API Keys에서 발급 가능합니다.
트루나스 11버전 이전을 사용할 경우는 root 패스워드를 입력해줍니다.

[deploy]
# Choose one of the following authentication methods, "api_key" or "password" (comment out the other one).
# Auth via API keys is highly recommended, but is only available from TrueNAS (Core) 12.0 up.
# You can generate a new API key in the web interface under "Settings" (upper right) > "API Keys".
api_key = (APIKEY)
# If you are on FreeNAS 11 or lower, set this to your FreeNAS root password
# password = YourSuperSecurePassword#@#$*

.acme.sh

.acme.sh에서 방금 발급한 ssl인증서를 배포하고 콜백 커맨드로 방금 설치한 배포스크립트를 적용합니다. 배포스크립트는 아까 받은 deploy-freenas의 경로로 맞춰주세요.

.acme.sh/acme.sh --install-cert -d (도메인) --reloadcmd "/root/deploy-freenas/deploy_freenas.py

이후 방금 발급된 스크립트를 자동으로 갱신하도록 웹 GUI로 크론작업을 추가합니다.

/root/.acme.sh/acme.sh --cron

acme.sh가 매일 실행되게 되며 인증서가 60일이상 지난 경우 갱신을 시도합니다.

레퍼런스

0개의 댓글