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

병신·2023년 1월 14일
0

개요

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개의 댓글