분류 서버

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 명령어를 추천하지 않습니다.



curl https://get.acme.sh | sh


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



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{ } 에 넣어주시면 됩니다.


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



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


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


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


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

관련자료

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

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

댓글 17개 / 2페이지

JKwang님의 댓글

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"

입력하면 dns에 txt입력하는곳에서 확인을 기다리지 않고 그냥 진행되버려서 오류가 납니다. dns수정할 시간을 안주네요;;

[root@web01 ssl]# acme.sh --issue --dns dns_cf -d domain.co.kr -d *.domain.co.kr --key-file /etc/nginx/ssl/privkey.pem --fullchain-file /etc/nginx/ssl/fullchain.pem --cert-file /etc/nginx/ssl/chain.pem
[2020. 09. 23. (수) 16:29:50 KST] Using CA: https://acme-v02.api.letsencrypt.org/directory
[2020. 09. 23. (수) 16:29:50 KST] Creating domain key
[2020. 09. 23. (수) 16:29:50 KST] The domain key is here: /root/.acme.sh/domain.co.kr/domain.co.kr.key
[2020. 09. 23. (수) 16:29:50 KST] Multi domain='DNS:domain.co.kr,DNS:*.domain.co.kr'
[2020. 09. 23. (수) 16:29:50 KST] Getting domain auth token for each domain
[2020. 09. 23. (수) 16:29:54 KST] Getting webroot for domain='domain.co.kr'
[2020. 09. 23. (수) 16:29:54 KST] Getting webroot for domain='*.domain.co.kr'
[2020. 09. 23. (수) 16:29:54 KST] Adding txt value: 7rgKrjxu3r8G3GcpAyFwE43-fxES6YxbB41jevFWITA for domain:  _acme-challenge.domain.co.kr
[2020. 09. 23. (수) 16:29:55 KST] invalid domain
[2020. 09. 23. (수) 16:29:55 KST] Error add txt for domain:_acme-challenge.domain.co.kr
[2020. 09. 23. (수) 16:29:55 KST] Please add '--debug' or '--log' to check more details.
[2020. 09. 23. (수) 16:29:55 KST] See: https://github.com/acmesh-official/acme.sh/wiki/How-to-debug-acme.sh

let's encrypt로 할때는 _acme-challenge 검증하는곳에서 멈춰서 dns수정할 시간을 줬었는데요...
이 경우에는 어떻게 해야 할까요???

참고로 도메인은 무료도메인이 아닙니다. cafe24에서 구입한 co.kr 도메인입니다.

우성짱님의 댓글의 댓글

음.. 제가 봤을 때는 invalid domain 이라는 뜻은 도메인과 DNS 연결이 안된 것으로 느껴집니다.

즉 해당 도메인과 클라우드플레어가 연계가 안됐다고 보는게 맞는 것 같습니다.

검증할 시간은 원래 줍니다. 20초 정도 기본으로 들어있습니다.

JKwang 작성일님의 댓글의 댓글

아..그러면 네임서버를 클라우드플레어로 바꿔야 하나봐요???
본문 내용중엔 도메인과 클라우드플레어 연계를 하는내용이 없는거 같습니다.음...

우성짱님의 댓글의 댓글

아... 그렇게 느끼실 수도 있겠네요.

저는 와일드카드 인증서 발급을 위해 DNS 서비스를 클라우드플레어나 luadns를 추천하고 있습니다.

일단 acme.sh와 연동되는 DNS 서비스들을 쓰면 와일드카드 인증서 발급이 DNS API 인증으로 가능하기 때문입니다.

DNS 서비스를 클라우드플레어나 LUADNS로 옮기신 후 API 발급하여 사용하면 됩니다.

이 글은 클라우드플레어와 연동되어 사용하는 방법입니다.

해당 내용을 추가하였습니다.
Total 157 / 1 Page
RSS
그누보드 SMTP 외부메일 설정하는 방법 댓글 6

그누보드 예전에우분투 20.04에서 구글 SMTP메일서버를 활용한 postfix 메일 보내기(https://www.wsgvet.com/home/594)를…

그누보드5에 실시간 채팅 구축하기

서버 현재 제 홈페이지에 있는 실시간 채팅 기능 적용방법을 알려드리겠습니다.원래 기능이 더 업그레이드되면 올리려고 했는데, 언제 업그레이드가 될지 몰…

메일 서버를 Docker로 구축하여 그누보드, 라이믹스, 워드프레스와 연결하기

서버 들어가며도커로 메일서버 구축하기( https://www.wsgvet.com/home/673 )엊그제 윗 글을 올렸습니다.기존에 올렸던 글은 모든…

도커로 메일서버 구축하기

서버 도커 메일서버란?도커에서 메일서버를 직접 운영할 수 있게 해줍니다.SMTP, ESMTP, POP3, IMAP 방식을 사용할 수 있습니다.자신의 …

그누보드5.4 나리야빌더에서 box shadow 효과 적용하기

나리야 현재 제 홈페이지 본문 이미지에 적용된 box shadow 효과를 적용하는 방법에 대해 알려드리겠습니다.우선 적용 전 이미지입니다.위와 같이 사…

그누보드 나리야빌더 NB-Basic 보드스킨 GIF 움짤 표현 최적화하기 댓글 2

나리야 그누보드 5.4.2.8 버전부터 움직이는 GIF 이미지를 올리면 MP4나 WEBM으로 변환하여 보여줄 수 있습니다.https://sir.kr/g…

최근글


새댓글