작업실
서버 분류

DNS 인증을 통한 acme.sh Letsencrypt SSL 인증서 발급받기

컨텐츠 정보

본문


0. 들어가며 


지난 달에 ECDSA Wildcard 인증서 발급 받는 방법에 대해 글을 올렸습니다.


https://www.wsgvet.com/bbs/board.php?bo_table=home&wr_id=591


위 링크의 글과 90% 이상 겹치지만 RSA 인증서, ECDSA 인증서, 와일드카드 인증서 발급까지 처음부터 끝까지 정리해보겠습니다.


보통 letsencrypt 패키지를 많이 이용하지만, 저는 acme.sh를 이용하는 방법을 알려드리겠습니다.



1. acme.sh 설치하기



sudo su


위 명령어로 root 계정으로 들어갑니다.


root 계정이 아니면 권한 문제가 생길 수 있습니다. 공식 매뉴얼에는 sudo 명령어를 추천하지 않습니다.



위 명령어로 설치할 수 있습니다. 만약에 안된다면



wget -O - https://get.acme.sh | sh


위 명령어로도 설치할 수 있습니다.



  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   775    0   775    0     0   1845      0 --:--:-- --:--:-- --:--:--  1845
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  193k  100  193k    0     0   391k      0 --:--:-- --:--:-- --:--:--  391k
[Thu Jul 23 12:54:49 UTC 2020] Installing from online archive.
[Thu Jul 23 12:54:49 UTC 2020] Downloading https://github.com/acmesh-official/acme.sh/archive/master.tar.gz
[Thu Jul 23 12:54:50 UTC 2020] Extracting master.tar.gz
[Thu Jul 23 12:54:50 UTC 2020] It is recommended to install socat first.
[Thu Jul 23 12:54:50 UTC 2020] We use socat for standalone server if you use standalone mode.
[Thu Jul 23 12:54:50 UTC 2020] If you don't use standalone mode, just ignore this warning.
[Thu Jul 23 12:54:50 UTC 2020] Installing to /root/.acme.sh
[Thu Jul 23 12:54:50 UTC 2020] Installed to /root/.acme.sh/acme.sh
[Thu Jul 23 12:54:50 UTC 2020] Installing alias to '/root/.bashrc'
[Thu Jul 23 12:54:50 UTC 2020] OK, Close and reopen your terminal to start using acme.sh
[Thu Jul 23 12:54:50 UTC 2020] Installing cron job
no crontab for root
no crontab for root
[Thu Jul 23 12:54:50 UTC 2020] Good, bash is found, so change the shebang to use bash as preferred.
[Thu Jul 23 12:54:51 UTC 2020] OK
[Thu Jul 23 12:54:51 UTC 2020] Install success!


위와 같이 설치가 됩니다. 빨간색 글자가 나오는데, 무시해도 됩니다.


SSH 터미널(Putty 등)을 끄고, 다시 접속합니다.


SSH에 다시 접속하면 별다른 작업을 하지 않아도 root 계정으로 acme.sh 명령어를 바로 쓸 수 있습니다.




2. 클라우드플레어 API key 찾고 입력하기


https://blog.wsgvet.com/cloudflare-sign-in-and-change-nameserver/


우선 위와 같이 자신의 도메인 관리사이트에서 DNS 네임서버를 클라우드플레어로 바꿉니다.



클라우드플레어의 DNS 인증을 통한 인증서 발급이 가장 간편하고 좋다고 생각합니다.


하지만 아쉽게도 .cf, .ga, .gq, .ml .tk와 같은 Freenom에서 발급된 무료 도메인에 대해서는 DNS 인증을 지원하지 않습니다.


그 이유는 무료 도메인의 경우 대부분이 스팸 또는 테스트 용도로 쓰고 있기 때문이라고 생각합니다.


acme.sh의 경우 와일드카드 SSL 인증서를 받으려면 DNS 인증을 받아야 되는데, 무료도메인의 경우 불가능 하기 때문에 


다른 DDNS 서비스를 사용하거나, 4번의 멀티도메인으로 발급 받기로 가면 됩니다!


무료도메인의 경우 LuaDNS API를 이용한 무료도메인 와일드카드 SSL 인증서 발급 받기(링크)를 추천드립니다.


.cf, .ga, .gq, .ml .tk 도메인이 아니라면 클라우드플레어 API 인증 받는 것이 추후에도 훨씬 편하기 때문에 추천드립니다.



https://dash.cloudflare.com/profile/api-tokens


위 링크로 들어가서 로그인 후 API keys를 찾습니다.



Keys used to access Cloudflare APIs.


Global API Key에서 View를 누릅니다.


비번 인증하고 사람 체크하면 키가 보입니다.



123891273487129384123asdfajsdfa   


위와 같은 형식으로 나올텐데요.


SSH에서 




sudo su
mkdir -p /etc/nginx/ssl


위 명령어로 root로 로그인 후 인증서 발급 받을 폴더를 생성합니다.




export CF_Key="123891273487129384123asdfajsdfa"


위와 같이 넣어줍니다.




export CF_Email="xxxx@sss.com"


위와 같은 형식으로 이메일 주소도 넣습니다.



3. 인증서 발급받기


이제 인증서를 발급 받을 차례입니다.




acme.sh --issue --dns dns_cf -d example.com -d www.example.com --key-file /etc/nginx/ssl/privkey.pem --fullchain-file /etc/nginx/ssl/fullchain.pem --cert-file /etc/nginx/ssl/chain.pem --reloadcmd "systemctl reload nginx.service"


위의 example.com 부분을 자신의 도메인 주소로 바꾸고 실행해봅니다.


실제 결과



[Tue 02 Jun 2020 07:20:39 PM KST] Creating domain key
[Tue 02 Jun 2020 07:20:39 PM KST] The domain key is here: /etc/letsencrypt/wsgvet.com/wsgvet.com.key
[Tue 02 Jun 2020 07:21:26 PM KST] Multi domain='DNS:wsgvet.com,DNS:*.wsgvet.com'
[Tue 02 Jun 2020 07:21:26 PM KST] Getting domain auth token for each domain
[Tue 02 Jun 2020 07:21:33 PM KST] Getting webroot for domain='wsgvet.com'
[Tue 02 Jun 2020 07:21:33 PM KST] Getting webroot for domain='*.wsgvet.com'
[Tue 02 Jun 2020 07:21:33 PM KST] Adding txt value: k for domain:  _acme-challenge.wsgvet.com
[Tue 02 Jun 2020 07:21:35 PM KST] Adding record
[Tue 02 Jun 2020 07:21:35 PM KST] Added, OK
[Tue 02 Jun 2020 07:21:35 PM KST] The txt record is added: Success.
[Tue 02 Jun 2020 07:21:35 PM KST] Adding txt value: 7iL0 for domain:  _acme-challenge.wsgvet.com
[Tue 02 Jun 2020 07:21:37 PM KST] Adding record
[Tue 02 Jun 2020 07:21:38 PM KST] Added, OK
[Tue 02 Jun 2020 07:21:38 PM KST] The txt record is added: Success.
[Tue 02 Jun 2020 07:21:38 PM KST] Let's check each dns records now. Sleep 20 seconds first.
[Tue 02 Jun 2020 07:21:59 PM KST] Checking wsgvet.com for _acme-challenge.wsgvet.com
[Tue 02 Jun 2020 07:21:59 PM KST] Domain wsgvet.com '_acme-challenge.wsgvet.com' success.
[Tue 02 Jun 2020 07:21:59 PM KST] Checking wsgvet.com for _acme-challenge.wsgvet.com
[Tue 02 Jun 2020 07:22:00 PM KST] Domain wsgvet.com '_acme-challenge.wsgvet.com' success.
[Tue 02 Jun 2020 07:22:00 PM KST] All success, let's return
[Tue 02 Jun 2020 07:22:00 PM KST] Verifying: wsgvet.com
[Tue 02 Jun 2020 07:22:05 PM KST] Success
[Tue 02 Jun 2020 07:22:05 PM KST] Verifying: *.wsgvet.com
[Tue 02 Jun 2020 07:22:09 PM KST] Success
[Tue 02 Jun 2020 07:22:09 PM KST] Removing DNS records.
[Tue 02 Jun 2020 07:22:09 PM KST] Removing txt: qehk for domain: _acme-challenge.wsgvet.com
[Tue 02 Jun 2020 07:22:11 PM KST] Removed: Success
[Tue 02 Jun 2020 07:22:11 PM KST] Removing txt: Vc4a9s7iL0 for domain: _acme-challenge.wsgvet.com
[Tue 02 Jun 2020 07:22:14 PM KST] Removed: Success
[Tue 02 Jun 2020 07:22:14 PM KST] Verify finished, start to sign.
[Tue 02 Jun 2020 07:22:14 PM KST] Lets finalize the order, Le_OrderFinalize:
[Tue 02 Jun 2020 07:22:16 PM KST] Download cert, Le_LinkCert: 
[Tue 02 Jun 2020 07:22:18 PM KST] Cert success.
-----BEGIN CERTIFICATE-----
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-----END CERTIFICATE-----
[Tue 02 Jun 2020 07:22:18 PM KST] Your cert is in  /etc/letsencrypt/wsgvet.com/wsgvet.com.cer
[Tue 02 Jun 2020 07:22:18 PM KST] Your cert key is in  /etc/letsencrypt/wsgvet.com/wsgvet.com.key
[Tue 02 Jun 2020 07:22:18 PM KST] The intermediate CA cert is in  /etc/letsencrypt/wsgvet.com/ca.cer
[Tue 02 Jun 2020 07:22:18 PM KST] And the full chain certs is there:  /etc/letsencrypt/wsgvet.com/fullchain.cer
[Tue 02 Jun 2020 07:22:18 PM KST] Installing cert to:/etc/nginx/ssl/chain.pem
[Tue 02 Jun 2020 07:22:18 PM KST] Installing key to:/etc/nginx/ssl/privkey.pem
[Tue 02 Jun 2020 07:22:18 PM KST] Installing full chain to:/etc/nginx/ssl/fullchain.pem
[Tue 02 Jun 2020 07:22:18 PM KST] Run reload cmd: systemctl reload nginx.service
[Tue 02 Jun 2020 07:22:18 PM KST] Reload success
~#


위와 같이 잘 발급되고, 인증서도 원하는 위치로 이동된 것을 알 수 있습니다.


프라이빗 키 경로 : /etc/nginx/ssl/privkey.pem

chain 인증서 경로 : /etc/nginx/ssl/chain.pem

fullchain 인증서 : /etc/nginx/ssl/fullchain.pem

위 경로를 꼭 기억해두시는게 좋습니다.


Nginx나 apache에 들어가는 부분이기 때문입니다.



참고로 ECDSA 인증서를 발급 받고 싶으시면


위 명령어에서 --keylength ec-256 (prime256v1, ECDSA P-256) 또는 --keylength ec-384 (secp384r1, ECDSA P-384)를 넣어주면 됩니다.



acme.sh --issue --dns dns_cf --keylength ec-256 -d example.com -d www.example.com --key-file /etc/nginx/ssl/privkey.pem --fullchain-file /etc/nginx/ssl/fullchain.pem --cert-file /etc/nginx/ssl/chain.pem --reloadcmd "systemctl reload nginx.service"


위와 같이 실행하면 ECDSA P-256 인증서가 생성됩니다.


그리고 와일드카드 인증서를 발고 싶으시면 -d *.example.com을 넣으면 됩니다.



acme.sh --issue --dns dns_cf --keylength ec-256 -d example.com -d *.example.com --key-file /etc/nginx/ssl/privkey.pem --fullchain-file /etc/nginx/ssl/fullchain.pem --cert-file /etc/nginx/ssl/chain.pem --reloadcmd "systemctl reload nginx.service"


위와 같이 설정하면 example.com의 와일드카드 인증서(ECDSA P-256)가 발급됩니다.



4. cf, ga, gq, ml tk 무료 도메인에서 SSL 인증서 발급 받고 자동 갱신하기


위와 같은 도메인을 사용한다면 DNS 인증을 통해 인증서를 받기 어렵습니다.


하지만 Webroot 형식을 사용하면 현재 사용하거나, 사용하고 싶은 도메인을 모두 등록할 수 있습니다.



sudo su
mkdir /etc/nginx/ssl


우선 위와 같이 root로 로그인 후 SSL 인증서가 저장될 폴더를 지정합니다.



acme.sh --issue -w /var/www/wordpress -d aced.ga -d www.aced.ga -d blog.aced.ga -d home.aced.ga -d nas.aced.ga --key-file /etc/nginx/ssl/privkey.pem --fullchain-file /etc/nginx/ssl/fullchain.pem --cert-file /etc/nginx/ssl/chain.pem --reloadcmd "systemctl reload nginx.service"


위와 같이 webroot 방식으로 발급받으면 멀티도메인 거의 무제한(100개까지)으로 발급 받을 수 있습니다.


대신에 /var/www/wordpress 또는 /var/www/gnuboard 같은 현재 웹서버의 root 폴더를 지정해줘야 합니다.


발급 받고 싶은 도메인 주소도 -d example.com 형식으로 추가해주면 됩니다.



[Tue 02 Jun 2020 10:35:49 PM KST] Your cert is in  /root/.acme.sh/aced.ga/aced.ga.cer
[Tue 02 Jun 2020 10:35:49 PM KST] Your cert key is in  /root/.acme.sh/aced.ga/aced.ga.key
[Tue 02 Jun 2020 10:35:49 PM KST] The intermediate CA cert is in  /root/.acme.sh/aced.ga/ca.cer
[Tue 02 Jun 2020 10:35:49 PM KST] And the full chain certs is there:  /root/.acme.sh/aced.ga/fullchain.cer
[Tue 02 Jun 2020 10:35:49 PM KST] Installing cert to:/etc/nginx/ssl/chain.pem
[Tue 02 Jun 2020 10:35:49 PM KST] Installing key to:/etc/nginx/ssl/privkey.pem
[Tue 02 Jun 2020 10:35:49 PM KST] Installing full chain to:/etc/nginx/ssl/fullchain.pem
[Tue 02 Jun 2020 10:35:49 PM KST] Run reload cmd: systemctl reload nginx.service
[Tue 02 Jun 2020 10:35:49 PM KST] Reload success


위와 같이 잘 발급되고, 원하는 위치에 인증서가 이동된 것을 확인할 수 있습니다.


프라이빗 키 경로 : /etc/nginx/ssl/privkey.pem

chain 인증서 경로 : /etc/nginx/ssl/chain.pem

fullchain 인증서 : /etc/nginx/ssl/fullchain.pem

위 경로를 꼭 기억해두시는게 좋습니다.


Nginx나 apache에 들어가는 부분이기 때문입니다.



참고로 ECDSA 인증서를 발급 받고 싶으시면


위 명령어에서 --keylength ec-256 (prime256v1, ECDSA P-256) 또는 --keylength ec-384 (secp384r1, ECDSA P-384)를 넣어주면 됩니다.



acme.sh --issue --keylength ec-256 -w /var/www/wordpress -d aced.ga -d www.aced.ga -d blog.aced.ga -d home.aced.ga -d nas.aced.ga --key-file /etc/nginx/ssl/privkey.pem --fullchain-file /etc/nginx/ssl/fullchain.pem --cert-file /etc/nginx/ssl/chain.pem --reloadcmd "systemctl reload nginx.service"


위와 같이 실행하면 ECDSA P-256 인증서가 생성됩니다.



5. 발급 리스트 확인하기



acme.sh list


위 명령어를 넣으면



Main_Domain  KeyLength  SAN_Domains                                   Created                                    Renew
wsgvet.com   "ec-384"   *.wsgvet.com,pogovet.com,*.pogovet.com  Tue 02 Jun 2020 10:34:07 AM UTC  Sat 01 Aug 2020 10:34:06 AM UTC


위와 같이 발급 정보가 나옵니다.



무료 도메인 멀티도메인의 경우



$ acme.sh list
Main_Domain  KeyLength  SAN_Domains                                              Created                                   Renew
aced.ga                        www.aced.ga,blog.aced.ga,home.aced.ga,nas.aced.ga  Tue 02 Jun 2020 01:35:49 PM UTC  Sat 01 Aug 2020 01:35:49 PM UTC


위와 같이 도메인이 모두 들어있고, 자동갱신도 되는 것을 확인할 수 있습니다.



6. 자동갱신 삭제하기


잘못 발급받았거나, 필요없을땐 삭제해야겠죠.



acme.sh --remove -d yourdomain.com


위 명령으로 자동갱신이 삭제됩니다. 아까 위에 있던 Main_Domain에 있는 것 1개만 넣으면 됩니다.



[Tue 02 Jun 2020 07:29:05 PM KST] wsgvet.com is removed, the key and cert files are in /etc/letsencrypt/wsgvet.com
[Tue 02 Jun 2020 07:29:05 PM KST] You can remove them by yourself.


위와 같이 자동갱신이 삭제되었고, 해당 폴더는 삭제가 안되니, 스스로 삭제하라고 합니다. ㅎㅎ



--ecc 를 통해서 ECDSA 인증서를 발급 받았을 경우 --ecc 옵션을 줘야 삭제가 가능합니다.



acme.sh --remove -d yourdomain.com --ecc


위와 같이 삭제하면 됩니다.



# acme.sh --remove -d aced.ga -d ball.ml --ecc
[Sat 01 Aug 2020 07:20:24 PM KST] aced.ga is removed, the key and cert files are in /root/.acme.sh/aced.ga_ecc
[Sat 01 Aug 2020 07:20:24 PM KST] You can remove them by yourself.


위와 같이 삭제되었고, 인증서는 스스로 삭제하라고 합니다. ㅎㅎ



7. acme.sh 자동 업그레이드 하기


acme.sh도 개발자에 의해 업그레이되 되기 때문에 업그레이드를 시켜주는 것이 좋습니다.



acme.sh --upgrade --auto-upgrade


위 명령어를 넣으면 됩니다.



[Tue 02 Jun 2020 06:42:39 PM KST] Already uptodate!
[Tue 02 Jun 2020 06:42:39 PM KST] Upgrade success!


위와 같이 나오면 성공입니다.



8. 자동갱신 확인하기


acme.sh로 인증서를 발급받았다면 자동으로 발급 후 60일 뒤에 갱신하게 됩니다.


별다른 작업이 필요없는 것이 큰 장점입니다.




crontab -e


위 명령어를 넣으면 



50 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null


위와 같이 매일 한번씩 시도하는 것을 알 수 있습니다.



9. Nginx에 적용하기


443포트를 받는 server{ } 에 넣어주시면 됩니다.


기존 인증서 경로 바로 밑에 넣어주셔도 되구요.


nginx">
ssl_certificate_key /etc/nginx/ssl/privkey.pem;

nginx">
ssl_certificate /etc/nginx/ssl/fullchain.pem;

nginx">
ssl_trusted_certificate /etc/nginx/ssl/chain.pem;


위와 같이 인증서의 경로룰 넣어주시면 됩니다.

관련자료

  • 서명
    우성짱의 NAS를 운영하고 있습니다.

    저의 즐거움이 여러분의 즐거움이면 좋겠습니다.

댓글 24 / 3 페이지

djkiller님의 댓글

3번 인증서 발급받기, 해당도메인 변경하고 명령어를 주니 아래와 같이 나옵니다.
설치가 제대로 안된거 같은데 어디를 체크해봐야할까요?ㅠ

도메인은 호스팅KR에서 등록하였고, 네임서버는 클라우드로 변경하였고 vultr 에도 서버아이피와 도메인 연결후 네임서버 클라우드로 변경해놨습니다.
[Thu 09 Jun 2022 03:32:59 AM UTC] Using CA: https://acme.zerossl.com/v2/DV90
[Thu 09 Jun 2022 03:32:59 AM UTC] Create account key ok.
[Thu 09 Jun 2022 03:32:59 AM UTC] No EAB credentials found for ZeroSSL, let's get one
[Thu 09 Jun 2022 03:32:59 AM UTC] acme.sh is using ZeroSSL as default CA now.
[Thu 09 Jun 2022 03:32:59 AM UTC] Please update your account with an email address first.
[Thu 09 Jun 2022 03:32:59 AM UTC] acme.sh --register-account -m my@example.com
[Thu 09 Jun 2022 03:32:59 AM UTC] See: https://github.com/acmesh-official/acme.sh/wiki/ZeroSSL.com-CA
[Thu 09 Jun 2022 03:32:59 AM UTC] Please add '--debug' or '--log' to check more details.
[Thu 09 Jun 2022 03:32:59 AM UTC] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

우성짱님의 댓글의 댓글

acme.sh --register-account -m my@example.com

위와 같은 형식으로 이메일을 등록해주면 됩니다.

그리고 다시 발행하는 명령어를 내리면 잘 될거예요.
전체 33 / 1 페이지
RSS

최근글


새댓글


알림 0