TrueNAS는 자체적으로 CA 사설 인증서를 만들거나 상용 인증서를 가져와 https 프로토콜을 사용하는 기능을 가지고 있었습니다. 이는 일반적으로 사용할 디바이스에 신뢰 인증서를 추가하거나 상용 인증서에 대한 비용을 지불해야 함을 의미했습니다.
이 포스트에서는 사용자에게 무료로 TLS 인증서를 발급해주는 비영리기관인 Let's Encrypt을 사용해 자동으로 SSL 인증서를 갱신하는 방법에 대해 설명합니다. 트루나스에서 사용하고있는 서비스에 적용을 편리하게 할 수 있도록 도와주는 deploy-freenas 또한 함께 설명합니다.
이 문서에서 인증서 발급은 .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를 사용한 방법으로 발급합니다. 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 스크립트를 받고, .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에서 방금 발급한 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일이상 지난 경우 갱신을 시도합니다.