컨텐츠로 건너뛰기

클라우드 패널(CloudPanel) ACME GTS 구글 와일드카드 인증서 발급하기 (심화)

클라우드 패널에서 클라우드 플레어 프록시를 켜면, 인증서 발급이 되지 않죠. 그래서 1. 클라우드플레어 원본 인증서를 업로드하거나, 2. 인증서 발급할 때, 프록시를 끄면 되는데, 번거롭죠. 그리고 사이트를 만들면 새로 인증서를 붙여줘야 하는데 그것도 귀찮습니다. 끄면 인증서 오류가 나는 것도 문제입니다.
그래서 간단하게 acme.sh로 미리 인증서를 만들어두고, incron으로 사이트가 생기면 바로 인증서를 붙여보겠습니다. DNS API를 사용하므로, 와일드 카드 인증서도 발급가능합니다. 이 글은 GTS를 사용해서 발급합니다. 그러나 꼭 구글 인증서를 사용하지 않으셔도 Let’s encrypt나 기타 인증서도 발급해서 바로 붙일 수 있습니다.

어렵지는 않습니다만, 개인에 맞게 수정을 조금 하셔야 합니다. 따라서 처음 하시는 거라면 낯설어 어렵게 느껴질 수 있습니다. 그래도 최대한 자세하게 기록 해보겠습니다.

크게 작동 로직은 아래와 같습니다.

  1. acme.sh로 미리 인증서를 발급

  2. incron으로 /etc/nginx/sites-enabled/ 경로 감시

  3. 클라우드 패널에서 사이트 생성 (그 결과 /etc/nginx/sites-enabled/에 파일이 생김)

  4. incron 트리거로 clp 명령어 실행, 루트 도메인으로 검색해서 생성된 사이트에 기존에 발급해 놓은 인증서 붙임

  5. (결론) 따라서 미리 사이트를 만드신 상황이라면, 수동으로 한번은 붙여주셔야 합니다.

1. acme와 incron 설치하기

Terminal window
sudo apt install incron

Terminal window
sudo su

Terminal window
curl https://get.acme.sh | sh -s email=나의 이메일@example.com

원본 깃허브 [[바로가기](https://github.com/ccMatrix/cloudpanel.helper)] (Apache License 2.0)
포크 깃허브 [[바로가기](https://github.com/Navystack/cloudpanel.helper)] (Apache License 2.0)

Terminal window
git clone https://github.com/Navystack/cloudpanel.helper.git

(포크 후 acme.sh 기본 옵션으로 인증서를 발급하면 생기는 경로로 맵핑 했습니다.)

Terminal window
cp /home/ubuntu/cloudpanel.helper/wildcard-certificates/clp-install-certificate /usr/local/bin/clp-install-certificate
Terminal window
chmod +x /usr/local/bin/clp-install-certificate
Terminal window
echo "root" | sudo tee -a /etc/incron.allow

Terminal window
incrontab -e
Terminal window
/etc/nginx/sites-enabled/ IN_CREATE /usr/local/bin/clp-install-certificate $#

2. GCP EAB 키 ID 및 HMAC 요청

1) CLI 이용하기

Terminal window
gcloud config set project <내 프로젝트 ID>
Terminal window
gcloud projects add-iam-policy-binding project-blah-blah \
--member=user:<내 이메일 주소> \
--role=roles/publicca.externalAccountKeyCreator
Terminal window
gcloud services enable publicca.googleapis.com
Terminal window
gcloud publicca external-account-keys create
Created an external account key
[b64MacKey: <내 EAB HMAC 키>
keyId: <내 EAB key ID>]

2) GUI 이용하기

GCP 프로젝트를 선택한 후 바로 클라우드 쉘 실행 (종 왼쪽에 아이콘 있습니다.)

Terminal window
gcloud services enable publicca.googleapis.com
Terminal window
gcloud publicca external-account-keys create

Created an external account key
[b64MacKey: <내 EAB HMAC 키>
keyId: <내 EAB key ID>]

3. acme.sh에 등록

Terminal window
cd /root/.acme.sh/
Terminal window
./acme.sh --register-account -m <내 이메일 주소> --server google \
--eab-kid <내 EAB key ID> \
--eab-hmac-key <내 EAB HMAC 키>

4. 클라우드 플레어 API 토큰 발급

1) DNS API용 토큰 발급

  1. 사람 모양 클릭

  2. 내 프로필 클릭

  3. API 토큰

  4. 토큰 생성 클릭

  1. 탬플릿 사용 클릭

적절하게 권한 설정하시면 됩니다.
DNS 영역 편집 권한은 반드시 들어가야하며, 영역 리소스는 적절하게 선택하시면 됩니다.

요약 계속으로 진행합니다.

토큰 생성으로 진행합니다.

클라우드 플레어 API토큰이 나온 페이지를 닫지 마세요

보안을 위해서 한번만 보입니다.

2) 어디서든 좋습니다. 계정 ID 확인하기

저는 R2에서 확인했습니다.

Terminal window
export CF_Token="<token>"
Terminal window
export CF_Account_ID="<id>"

5. 인증서 발급하기

개인에 맞게 선택하시면 됩니다.
기본적인 구조는 1) 기본을 확인하시면 되고, 나머지는 개행해서 처음 하시는 분들이 보기 편하게 했습니다.

1) 기본

Terminal window
acme.sh --issue --dns dns_cf -d navystack.com -d *.navystack.com --force --server google

2) RSA-4096으로 발급

Terminal window
acme.sh --issue --dns dns_cf \
-d navystack.com \
-d *.navystack.com \
--force \
--keylength 4096 \
--server google

3) ECC로 발급

Terminal window
acme.sh --issue --dns dns_cf \
-d navystack.com \
-d *.navystack.com \
--force \
--keylength ec-256 \
--server google

단, ECC발급시 /usr/local/bin/clp-install-certificate 스크립트에서 경로 수정하거나, 발급하는 위치를 수정해야 합니다.

6. 스크립트 적용하고, Nginx 리로드

Terminal window
/usr/local/bin/clp-install-certificate && service nginx force-reload

7. (번외) CLI에서 기존에 만든 사이트에 바로 붙이기

Terminal window
clpctl site:install:certificate --domainName=domain.com --privateKey=/개인키경로/바꾸기/private.key --certificate=/체인인증서/경로로바꾸기/chain.crt

수고 많으셨습니다. 감사합니다.


Askfront.com (에스크프론트)

기존의 댓글 대신, 초보자도 자유롭게 질문할 수 있는 포럼을 만들었습니다.
에스크프론트에서는 가이드뿐만 아니라 모든 종류의 질문을 하실 수 있습니다.
검색해도 오래된 정보나 도움이 되지 않는 정보만 나오는 것 같고, 주화입마에 빠진 것 같은 기분이 들 때가 있습니다.
그럴 때, 부담 없이 질문해 주세요 :) 같이 의논하며 생각해봅시다.
가능하다면, 제가 답변 드리겠습니다. 고맙습니다.