Acme.sh Docker 이미지로 와일드카드 인증서 발급받기
컨텐츠 정보
- 18,051 조회
- 17 댓글
- 0 추천
- 목록
본문
1. 왜 도커로 설치할까요?
DNS 인증을 통한 acme.sh Letsencrypt SSL 인증서 발급받기
LuaDNS API를 이용한 무료도메인 와일드카드 SSL 인증서 발급 받기
acme.sh를 이용한 ECDSA Wildcard SSL 인증서 발급받는 방법
위와 같이 acme.sh를 활용한 글을 적었었는데요.
이번에는 acme.sh 도커 이미지로 발급 받는 방법에 대해 적습니다.
도커 이미지를 활용하면 호스트(내 컴퓨터, 또는 내 서버)에 지저분하게 깔리지 않고,
이미지 1개만 다운 받고 도커로 실행되기 때문에 깔끔합니다.
지우고 싶으면 그냥 도커 컨테이너와 이미지만 지우면 되구요.
언제 어디서나 같은 이미지를 활용할 수 있기 때문에 관리하기도 편합니다.
그리고 도커 이미지끼리 SSL 인증서 활용에도 더 편하기도 하구요.
또한 DNS API 인증으로 발급 받기 때문에 현재 서버에 웹서버가 없어도 발급됩니다.
도커 이외에 어떤 의존성도 없이 발급받을 수 있기 때문에 강력 추천합니다.
2. 와일드카드 인증서 발급을 위한 DNS API 정하기
https://github.com/acmesh-official/acme.sh/wiki/dnsapi
위 링크에 보면 DNS 제공자에 따른 설정 방법을 모두 적어두었습니다.
대표적으로 클라우드플레어 DNS API 설정 및 LuaDNS API 설정에 대해 알려드리겠습니다.
일반적인 유료 도메인(com, net, me, dev 등등)의 경우는 클라우드플레어를 추천합니다.
freenom의 무료 도메인(cf, ga, gq, ml, tk)의 경우는 LuaDNS를 추천합니다.
제가 추천한다고 해서 이 서비스들이 무조건 제일 좋다는게 아니고 설정하기 편해서 그렇습니다.
다른 DNS서비스도 같은 개념으로 발급받을 수 있으니 참조하시면 되겠습니다.
(1) 클라우드플레어를 선택했다면
클라우드플레어에 가입 및 도메인 등록 후
https://www.wsgvet.com/bbs/board.php?bo_table=home&wr_id=639
위 링크의 2번에서 API key를 찾습니다.
CF_Key=1231kjh23kj1h23kj1h23kj1h23123
CF_Email=email@email.com
위와 같이 설정할 것입니다.
(2) LuaDNS를 선택했다면
https://www.wsgvet.com/bbs/board.php?bo_table=home&wr_id=640
위 링크처럼 가입 및 도메인 설정한 뒤 4번의 API Token 값을 찾습니다.
LUA_Key=1231kjh23kj1h23kj1h23kj1h23123
LUA_Email=email@email.com
위와 같이 설정할 것입니다.
이제 이렇게 찾은 값을 .env 파일에 저장 할 것입니다.
nano .env
위와 같이 .env 파일을 생성합니다.
그리고 위에서 설정한 내용을 그대로 넣고
컨트롤 + O, 엔터, 컨트롤 + X로 저장해주고 나옵니다.
3. Docker Compose 설정하기
저는 docker 명령어보다 docker-compose를 더 좋아합니다.
더 편하고 직관적인 느낌이 좋더라구요 ㅎㅎ
아직 도커를 설치하지 않았다면
https://www.wsgvet.com/bbs/board.php?bo_table=ubuntu&wr_id=96
위 링크의 1번과 2번을 참조하여 설치하면 됩니다.
우선 인증서가 들어갈 폴더를 생성합니다.
폴더까지 자동으로 생성해주지는 않더라구요.
mkdir -p ./site/ssl
위와 같이 현재 위치에서 site 폴더와 그 하위에 ssl 이라는 폴더를 같이 생성했습니다.
이제 ssl 폴더에 인증서를 넣을 것입니다.
nano docker-compose.yml
위 명령어로 도커 컴포즈 파일을 생성합니다.
version: '3'
services:
acme.sh:
image: neilpang/acme.sh
container_name: acme.sh
env_file: .env
volumes:
- ./data/acme.sh:/acme.sh
- ./site:/var/www/html
command: acme.sh --issue --staging --dns dns_cf -d example.com -d *.example.com --key-file /var/www/html/ssl/privkey.pem --fullchain-file /var/www/html/ssl/fullchain.pem --cert-file /var/www/html/ssl/chain.pem
위 내용은 클라우드플레어를 선택했다면 쓸 수 있는 내용입니다.
LuaDNS를 선택했다면 dns_cf 대신에 dns_lua를 넣으면 됩니다.
version: '3'
services:
acme.sh:
image: neilpang/acme.sh
container_name: acme.sh
env_file: .env
volumes:
- ./data/acme.sh:/acme.sh
- ./site:/var/www/html
command: acme.sh --issue --staging --dns dns_lua -d example.com -d *.example.com --key-file /var/www/html/ssl/privkey.pem --fullchain-file /var/www/html/ssl/fullchain.pem --cert-file /var/www/html/ssl/chain.pem
LuaDNS의 경우 위와 같이 설정하면 되겠죠?
도메인은 꼭 자신의 것으로 바꿔주시구요.
컨트롤 + O, 엔터, 컨트롤 + X로 저장해주고 나옵니다.
이제 도커를 실행해봅니다.
4. 테스트 인증서 발급받기
sudo docker-compose up acme.sh
위 명령어를 내리면
# sudo docker-compose up acme.sh
Pulling acme.sh (neilpang/acme.sh:)...
latest: Pulling from neilpang/acme.sh
df20fa9351a1: Already exists
55ffa67455e2: Pull complete
3952aebf6eeb: Pull complete
38619139bf4b: Pull complete
291023932359: Pull complete
90ac48033759: Pull complete
3dab76226369: Pull complete
Digest: sha256:86cf3be4cd01039c0a9eb8463a6621ba8454049189b9e25020f7b5ce19d92bbb
Status: Downloaded newer image for neilpang/acme.sh:latest
Creating acme.sh ... done
Attaching to acme.sh
acme.sh | [Mon Aug 17 13:10:18 UTC 2020] Using stage ACME_DIRECTORY: https://acme-staging-v02.api.letsencrypt.org/directory
acme.sh | [Mon Aug 17 13:10:20 UTC 2020] Using CA: https://acme-staging-v02.api.letsencrypt.org/directory
acme.sh | [Mon Aug 17 13:10:20 UTC 2020] Creating domain key
acme.sh | [Mon Aug 17 13:10:20 UTC 2020] The domain key is here: /acme.sh/example.com/example.com.key
acme.sh | [Mon Aug 17 13:10:20 UTC 2020] Multi domain='DNS:example.com,DNS:*.example.com'
acme.sh | [Mon Aug 17 13:10:20 UTC 2020] Getting domain auth token for each domain
acme.sh | [Mon Aug 17 13:10:26 UTC 2020] Getting webroot for domain='example.com'
acme.sh | [Mon Aug 17 13:10:26 UTC 2020] Getting webroot for domain='*.example.com'
acme.sh | [Mon Aug 17 13:10:26 UTC 2020] Adding txt value: gI9uqlc4amM0BDx-MccFJe2sFlY6V1MmlbzzKLssASQ for domain: _acme-challenge.example.com
acme.sh | [Mon Aug 17 13:10:27 UTC 2020] Adding record
acme.sh | [Mon Aug 17 13:10:28 UTC 2020] Added
acme.sh | [Mon Aug 17 13:10:28 UTC 2020] The txt record is added: Success.
acme.sh | [Mon Aug 17 13:10:28 UTC 2020] Adding txt value: CRCFCAdWkZIpYlCcrM8CM7tDFdY4Ffg318D9ZLS2-Io for domain: _acme-challenge.example.com
acme.sh | [Mon Aug 17 13:10:29 UTC 2020] Adding record
acme.sh | [Mon Aug 17 13:10:30 UTC 2020] Added
acme.sh | [Mon Aug 17 13:10:30 UTC 2020] The txt record is added: Success.
acme.sh | [Mon Aug 17 13:10:30 UTC 2020] Let's check each DNS record now. Sleep 20 seconds first.
acme.sh | [Mon Aug 17 13:10:50 UTC 2020] Checking example.com for _acme-challenge.example.com
acme.sh | [Mon Aug 17 13:10:53 UTC 2020] Domain example.com '_acme-challenge.example.com' success.
acme.sh | [Mon Aug 17 13:10:53 UTC 2020] Checking example.com for _acme-challenge.example.com
acme.sh | [Mon Aug 17 13:10:56 UTC 2020] Domain example.com '_acme-challenge.example.com' success.
acme.sh | [Mon Aug 17 13:10:56 UTC 2020] All success, let's return
acme.sh | [Mon Aug 17 13:10:56 UTC 2020] Verifying: example.com
acme.sh | [Mon Aug 17 13:11:01 UTC 2020] Success
acme.sh | [Mon Aug 17 13:11:01 UTC 2020] Verifying: *.example.com
acme.sh | [Mon Aug 17 13:11:06 UTC 2020] Success
acme.sh | [Mon Aug 17 13:11:06 UTC 2020] Removing DNS records.
acme.sh | [Mon Aug 17 13:11:06 UTC 2020] Removing txt: gI9uqlc4amM0BDx-MccFJe2sFlY6V1MmlbzzKLssASQ for domain: _acme-challenge.example.com
acme.sh | [Mon Aug 17 13:11:09 UTC 2020] Removed: Success
acme.sh | [Mon Aug 17 13:11:09 UTC 2020] Removing txt: CRCFCAdWkZIpYlCcrM8CM7tDFdY4Ffg318D9ZLS2-Io for domain: _acme-challenge.example.com
acme.sh | [Mon Aug 17 13:11:11 UTC 2020] Removed: Success
acme.sh | [Mon Aug 17 13:11:11 UTC 2020] Verify finished, start to sign.
acme.sh | [Mon Aug 17 13:11:11 UTC 2020] Lets finalize the order, Le_OrderFinalize: https://acme-staging-v02.api.letsencrypt.org/acme/finalize/15180878/133054507
acme.sh | [Mon Aug 17 13:11:13 UTC 2020] Downloading cert, Le_LinkCert: https://acme-staging-v02.api.letsencrypt.org/acme/cert/fa3e9587a3386dee4a6794c43e267ba062b3
acme.sh | [Mon Aug 17 13:11:15 UTC 2020] Cert success.
acme.sh | -----BEGIN CERTIFICATE-----
acme.sh | -----END CERTIFICATE-----
acme.sh | [Mon Aug 17 13:11:15 UTC 2020] Your cert is in /acme.sh/example.com/example.com.cer
acme.sh | [Mon Aug 17 13:11:15 UTC 2020] Your cert key is in /acme.sh/example.com/example.com.key
acme.sh | [Mon Aug 17 13:11:15 UTC 2020] The intermediate CA cert is in /acme.sh/example.com/ca.cer
acme.sh | [Mon Aug 17 13:11:15 UTC 2020] And the full chain certs is there: /acme.sh/example.com/fullchain.cer
acme.sh | [Mon Aug 17 13:11:15 UTC 2020] Installing cert to:/var/www/html/example.com/chain.pem
acme.sh | [Mon Aug 17 13:11:16 UTC 2020] Installing cert to:/var/www/html/ssl/chain.pem
acme.sh | [Mon Aug 17 13:11:16 UTC 2020] Installing key to:/var/www/html/ssl/privkey.pem
acme.sh | [Mon Aug 17 13:11:16 UTC 2020] Installing full chain to:/var/www/html/ssl/fullchain.pem
acme.sh exited with code 0
위와 같이 정상적으로 발급 받고, 원하는 위치에 인증서가 들어간 것을 볼 수 있습니다.
호스트(내 컴퓨터, 서버)에서는 아까 생성한 site/ssl 폴더에 인증서가 들어간 것을 확인할 수 있습니다.
5. SSL 인증서 발급받기
방금 발급받은 것은 staging에서 발급 받은 것으로 실사용에서는 쓸 수 없습니다.
테스트로 받은 이유는 Let's Encrypt에서 일주일에 받을 수 있는 인증서 갯수를 정해놨기 때문입니다.
이리저리 테스트하다가 그 횟수를 넘기면 일주일이나 기다려야하기 때문에 테스트용으로 받은 것입니다.
테스트 인증서를 문제없이 발급 받았다면, 이제 옵션을 바꿔봅시다.
nano docker-compose.yml
위 명령어로 도커 컴포즈 파일에 들어갑니다.
version: '3'
services:
acme.sh:
image: neilpang/acme.sh
container_name: acme.sh
env_file: .env
volumes:
- ./data/acme.sh:/acme.sh
- ./site:/var/www/html
command: acme.sh --issue --force --dns dns_cf -d example.com -d *.example.com --key-file /var/www/html/ssl/privkey.pem --fullchain-file /var/www/html/ssl/fullchain.pem --cert-file /var/www/html/ssl/chain.pem
위 내용처럼 수정합니다.
즉, --staging을 지우고 --force 옵션을 넣은 것입니다.
LuaDNS를 선택했다면 dns_cf 대신에 dns_lua를 넣으면 됩니다.
컨트롤 + O, 엔터, 컨트롤 + X로 저장해주고 나옵니다.
sudo docker-compose up acme.sh
위 명령어로 시작해줍니다.
#sudo docker-compose up acme.sh
Attaching to acme.sh
acme.sh | [Mon Aug 17 13:37:16 UTC 2020] Using CA: https://acme-v02.api.letsencrypt.org/directory
acme.sh | [Mon Aug 17 13:37:16 UTC 2020] Multi domain='DNS:example.com,DNS:*.example.com'
acme.sh | [Mon Aug 17 13:37:16 UTC 2020] Getting domain auth token for each domain
acme.sh | [Mon Aug 17 13:37:23 UTC 2020] Getting webroot for domain='example.com'
acme.sh | [Mon Aug 17 13:37:23 UTC 2020] Getting webroot for domain='*.example.com'
acme.sh | [Mon Aug 17 13:37:23 UTC 2020] Adding txt value: 6nHrBw7aIRm13eqih_20FAePSw9clq5m80_AyWdOHlw for domain: _acme-challenge.example.com
acme.sh | [Mon Aug 17 13:37:24 UTC 2020] Adding record
acme.sh | [Mon Aug 17 13:37:25 UTC 2020] Added
acme.sh | [Mon Aug 17 13:37:25 UTC 2020] The txt record is added: Success.
acme.sh | [Mon Aug 17 13:37:25 UTC 2020] Adding txt value: WJK_hTqAP_6NEqUzP20cpDejt-yUl27-Ki6QslGB8cI for domain: _acme-challenge.example.com
acme.sh | [Mon Aug 17 13:37:26 UTC 2020] Adding record
acme.sh | [Mon Aug 17 13:37:27 UTC 2020] Added
acme.sh | [Mon Aug 17 13:37:27 UTC 2020] The txt record is added: Success.
acme.sh | [Mon Aug 17 13:37:27 UTC 2020] Let's check each DNS record now. Sleep 20 seconds first.
acme.sh | [Mon Aug 17 13:37:47 UTC 2020] Checking example.com for _acme-challenge.example.com
acme.sh | [Mon Aug 17 13:37:49 UTC 2020] Domain example.com '_acme-challenge.example.com' success.
acme.sh | [Mon Aug 17 13:37:49 UTC 2020] Checking example.com for _acme-challenge.example.com
acme.sh | [Mon Aug 17 13:37:50 UTC 2020] Domain example.com '_acme-challenge.example.com' success.
acme.sh | [Mon Aug 17 13:37:50 UTC 2020] All success, let's return
acme.sh | [Mon Aug 17 13:37:50 UTC 2020] Verifying: example.com
acme.sh | [Mon Aug 17 13:37:56 UTC 2020] Success
acme.sh | [Mon Aug 17 13:37:56 UTC 2020] Verifying: *.example.com
acme.sh | [Mon Aug 17 13:38:01 UTC 2020] Success
acme.sh | [Mon Aug 17 13:38:01 UTC 2020] Removing DNS records.
acme.sh | [Mon Aug 17 13:38:01 UTC 2020] Removing txt: 6nHrBw7aIRm13eqih_20FAePSw9clq5m80_AyWdOHlw for domain: _acme-challenge.example.com
acme.sh | [Mon Aug 17 13:38:04 UTC 2020] Removed: Success
acme.sh | [Mon Aug 17 13:38:04 UTC 2020] Removing txt: WJK_hTqAP_6NEqUzP20cpDejt-yUl27-Ki6QslGB8cI for domain: _acme-challenge.example.com
acme.sh | [Mon Aug 17 13:38:07 UTC 2020] Removed: Success
acme.sh | [Mon Aug 17 13:38:07 UTC 2020] Verify finished, start to sign.
acme.sh | [Mon Aug 17 13:38:07 UTC 2020] Lets finalize the order, Le_OrderFinalize: https://acme-v02.api.letsencrypt.org/acme/finalize/94082185/4730969880
acme.sh | [Mon Aug 17 13:38:10 UTC 2020] Downloading cert, Le_LinkCert: https://acme-v02.api.letsencrypt.org/acme/cert/03da5cee1b8fcb695e54f29747f01f7eecbe
acme.sh | [Mon Aug 17 13:38:12 UTC 2020] Cert success.
acme.sh | -----BEGIN CERTIFICATE-----
acme.sh | -----END CERTIFICATE-----
acme.sh | [Mon Aug 17 13:38:12 UTC 2020] Your cert is in /acme.sh/example.com/example.com.cer
acme.sh | [Mon Aug 17 13:38:12 UTC 2020] Your cert key is in /acme.sh/example.com/example.com.key
acme.sh | [Mon Aug 17 13:38:12 UTC 2020] The intermediate CA cert is in /acme.sh/example.com/ca.cer
acme.sh | [Mon Aug 17 13:38:12 UTC 2020] And the full chain certs is there: /acme.sh/example.com/fullchain.cer
acme.sh | [Mon Aug 17 13:40:38 UTC 2020] Installing cert to:/var/www/html/ssl/chain.pem
acme.sh | [Mon Aug 17 13:40:38 UTC 2020] Installing key to:/var/www/html/ssl/privkey.pem
acme.sh | [Mon Aug 17 13:40:38 UTC 2020] Installing full chain to:/var/www/html/ssl/fullchain.pem
acme.sh exited with code 0
위와 같이 발행된 것을 확인할 수 있습니다.
6. 자동갱신 설정 Cron에 넣어주기
위 내용을 보면 아시겠지만 acme.sh 컨테이너는 본연의 임무를 수행하고 정지됩니다.
그러므로 자동갱신은 cron으로 따로 작성해야 합니다.
우선 도커 컴포즈 파일을 수정합니다.
nano docker-compose.yml
위 명령어로 도커 컴포즈 파일에 들어갑니다.
version: '3'
services:
acme.sh:
image: neilpang/acme.sh
container_name: acme.sh
env_file: .env
volumes:
- ./data/acme.sh:/acme.sh
- ./site:/var/www/html
command: acme.sh --cron --home "/acme.sh"
위 내용처럼 수정합니다.
컨트롤 + O, 엔터, 컨트롤 + X로 저장해주고 나옵니다.
이제 다시 재생성 해주면 자동으로 renew를 해줍니다.
nano ssl_renew.sh
재생성해주는 스크립트 파일을 생성합니다.
#!/bin/bash
COMPOSE="/usr/local/bin/docker-compose --no-ansi"
cd /home/sammy/gnuboard/
$COMPOSE up acme.sh && $COMPOSE kill -s SIGHUP nginx
위 내용에서 /home/sammy/gnuboard/ 는 지금 작업하고 있는 폴더를 넣으면 됩니다.
자신의 환경에 맞게 수정 후 컨트롤 + O, 엔터, 컨트롤 + X로 저장해주고 나옵니다.
참고로 && $COMPOSE kill -s SIGHUP nginx 부분은 갱신 후 nginx라는 컨테이너를 재실행 해주는 명령어입니다.
나중에 도커 컴포즈로 멀티사이트 운영하기 편을 따라하면 마지막은 이렇게 놔두면 됩니다.
단순히 갱신만 하려면 해당 내용을 삭제하면 됩니다.
chmod +x ssl_renew.sh
위와 같이 실행 가능하게 만듭니다.
sudo crontab -e
위와 같이 크론에 들어갑니다.
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]:
혹시 위와 같이 나오면 1번 엔터를 누릅니다.
제일 밑에
* * * * * /home/sammy/gnuboard/ssl_renew.sh >> /var/log/ssl_renew_cron.log 2>&1
위와 같이 넣습니다. 파일 경로는 자신에게 맞게 수정해야 합니다.
컨트롤 + O, 엔터, 컨트롤 + X 로 저장 후 빠져나옵니다.
이제 매분 ssl 갱신을 시도할 것입니다.
1분 뒤에
tail -f /var/log/ssl_renew_cron.log
위 명령어를 내리면
~/gnuboard$ tail -f /var/log/ssl_renew_cron.log
acme.sh | [Sun Aug 16 16:57:03 UTC 2020] ===Starting cron===
acme.sh | [Sun Aug 16 16:41:48 UTC 2020] Installing from online archive.
acme.sh | [Sun Aug 16 16:41:48 UTC 2020] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
acme.sh | [Sun Aug 16 16:41:51 UTC 2020] Extracting master.tar.gz
acme.sh | [Sun Aug 16 16:41:51 UTC 2020] Installing to /acme.sh
acme.sh | [Sun Aug 16 16:41:51 UTC 2020] Installed to /acme.sh/acme.sh
acme.sh | [Sun Aug 16 16:41:51 UTC 2020] OK
acme.sh | [Sun Aug 16 16:41:51 UTC 2020] Install success!
acme.sh | [Sun Aug 16 16:57:04 UTC 2020] Upgrade success!
acme.sh | [Sun Aug 16 16:57:04 UTC 2020] Auto upgraded to: 2.8.7
acme.sh | [Sun Aug 16 16:57:04 UTC 2020] Renew: 'example.com'
acme.sh | [Sun Aug 16 16:57:04 UTC 2020] Skip, Next renewal time is: Thu Oct 15 12:34:21 UTC 2020
acme.sh | [Sun Aug 16 16:57:04 UTC 2020] Add '--force' to force to renew.
acme.sh | [Sun Aug 16 16:57:04 UTC 2020] Skipped example.com
acme.sh | [Sun Aug 16 16:57:04 UTC 2020] ===End cron===
acme.sh exited with code 0
No such service: nginx
위와 같이 acme.sh를 다시 받고 알아서 체크하는 것을 볼 수 있습니다.
그리고 해당 내용이 끝나면 웹서버를 알아서 끄고 다시 실행하는 것을 볼 수 있습니다.
아직 nginx 컨테이너가 없어서 No such service가 나옵니다. 정상입니다.
이제 cron 작업을 매일 한번씩 실행되게 바꿔줍니다.
sudo crontab -e
위 명령어로 다시 cron에 들어간 다음
0 12 * * * /home/sammy/gnuboard/ssl_renew.sh >> /var/log/ssl_renew_cron.log 2>&1
매일 12시에 실행되도록 설정합니다.
컨트롤 + O, 엔터, 컨트롤 + X 로 저장 후 빠져나옵니다.
이제 하루에 한번 ssl 갱신을 시도할 것입니다.
7. 마치며
도커를 활용하면 깔끔하게 갱신까지 편하게 쓸 수 있습니다.
또한 이 방법으로 도커끼리 인증서를 공유하여 쓸 수도 있습니다.
https://www.wsgvet.com/bbs/board.php?bo_table=ubuntu&wr_id=123
위 글에 하나의 도커에 멀티사이트를 운영하는 글을 올렸습니다.
와일드카드 인증서를 받으면 멀티사이트 운영할 때 정말 좋습니다.
-
등록일 2020.10.10그누보드 SMTP 외부메일 설정하는 방법댓글 26
-
등록일 2020.10.03그누보드5에 실시간 채팅 구축하기댓글 13
-
등록일 2020.09.26
-
등록일 2020.09.24도커로 메일서버 구축하기댓글 4
관련자료
-
서명우성짱의 NAS를 운영하고 있습니다.
저의 즐거움이 여러분의 즐거움이면 좋겠습니다.
gotiger님의 댓글의 댓글
acme.sh | [Mon Mar 25 16:00:07 UTC 2024] Using ACME_DIRECTORY: https://acme-staging-v02.api.letsencrypt.org/directory
acme.sh | [Mon Mar 25 16:00:08 UTC 2024] Using CA: https://acme-staging-v02.api.letsencrypt.org/directory
인데
force 할때는
acme.sh | [Mon Mar 25 16:02:36 UTC 2024] Using CA: https://acme.zerossl.com/v2/DV90
acme.sh | [Mon Mar 25 16:02:36 UTC 2024] Create account key ok.
로 시작할까요.. ㄷㄷ
마지막에 0 으로 끝나긴 하는데 이게 성공했다는건지 실패했다는건지 뭔지 모르겠네여..