갱신을 암호화하자 Cron 작업


93

Apache2에서 Let 's Encrypt 인증서를 갱신하기 위해 cron 을 설정하는 올바른 방법 입니까? 우분투 16.04를 사용합니다.

@monthly letsencrypt renew && service apache2 reload

6
답변 중 하나가 아래 상태로, certbot의 v0.19.0 (그리고 어쩌면 일부 이전) 이미 crontab 항목에 @를 만들/etc/cron.d/certbot
xgMz

또한 tls-sni 유효성 검증이 포함 된 certbot 아파치 플러그인은 새 인증서가 검색된 후 유효성 검증 절차의 일부로 아파치를 다시로드합니다.
xgMz

아래의 답변은 새 설치에 매우 중요합니다 (JAN 2019 기준).
코리 로빈슨

답변:


145

월간은 충분하지 않습니다. 이 스크립트는 적어도 매주, 바람직하게는 매일 실행해야합니다. 인증서는 만료가 가까워지지 않으면 갱신되지 않으며, 월 단위로 갱신되기 전에 기존 인증서가 이미 만료되는 경우가 있습니다.

프로그램 이름은에서 이름 certbot이 변경되었습니다 letsencrypt. 그래도 계속 사용 letsencrypt중인 경우 현재 버전으로 업데이트해야합니다.

이러한 문제를 제외하고는 내 cron 작업과 거의 같습니다.

43 6 * * * certbot renew --post-hook "systemctl reload nginx"

18.04 LTS에서 letencrypt 패키지의 이름이 (최종) certbot으로 변경되었습니다. 이제 systemctl enable certbot.timer및로 certbot 갱신을 예약 할 수있는 시스템 타이머가 포함되어 있습니다 systemctl start certbot.timer. 그러나 우분투는 후크를 지정하는 방법을 제공하지 않았습니다. 우분투가 이것을 고칠 때까지 원하는 명령 줄로 재정의하기 certbot.service위해 재정의 를 설정해야합니다 ExecStart=.


3
"만료가 가까운 시간"은 몇시입니까?
Andre Figueiredo

3
인증서가 성공적으로 갱신 된 경우에만 다시 시작하는 것이 아니라 --renew-hook대신 사용자에게 더 좋습니다 --post-hook.
mwfearnley

6
아파치 / httpd, certbot renew그냥 작동 ™
aairey

1
nginx를 다시로드하기 위해 ExecStart를 재정의하는 대신 certbot.service에 ExecStartPost 행을 추가하여 웹 서버가 다시로드 된 후 추가하고 싶었습니다 ExecStartPost=/usr/sbin/service nginx reload. 나를 위해 일했다!
JD Mallen

1
@JDMallen 사용 ExecStartPost=하는 것이 좋습니다. 왜 그렇게 생각하지 않았습니까? 그러나이 service명령은 더 이상 사용되지 않습니다. 영원히있을 수는 없습니다. 해당 systemctl명령으로 전환하십시오 .
Michael Hampton

56

의견이 충분하지 않으므로 여기에 답변 해 드리겠습니다. 나는 최근 (2017 년 10 월) Ubuntu 16.04 서버에 certbot을 설치하고 실행했으며 갱신 cron 작업이에서 자동으로 생성되었습니다 /etc/cron.d/certbot.

생성 된 크론 작업은 다음과 같습니다.

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew

crontab 항목을 작성하기 전에이 파일이 이미 존재하는지 확인하는 것이 좋습니다.


1
certbot을 실행 한 후에도이 기능을 보았습니다. 암호화가이 작업을 수행 할 수있게 해주었습니다. 훌륭한 프로젝트입니다.
Bjorn

7
그것은 위의 크론 작업이 알고있는 가치가 되지 않습니다 실행 certbot renew하면 /run/systemd/system존재 - -이 대신 systemd 타이머가 certbot를 실행하기 때문이다 certbot 여기 systemd 타이머에 대한 자세한 내용 .
Hamish Downer

cronjob이 이미 설치되어 있다고 언급 해 주셔서 감사합니다. 나는 당신의 게시물을 읽을 때까지 그 사실을 몰랐습니다.
NilsB

1
궁금한 사람은 12 시간마다 실행합니다. 다른 답변 43 6 * * *은 매일 오전 6:43에 실행되도록합니다. 하루에 한 번이면 충분하지만 어느 쪽이든 잘 작동합니다.
orrd

42

certbot 문서는 하루에 두 번 스크립트를 실행하는 것이 좋습니다 :

노트 :

cron 또는 systemd 작업을 설정하는 경우 하루에 두 번 실행하는 것이 좋습니다 (인증서 갱신 또는 해지 기한까지는 아무 것도하지 않지만 정기적으로 실행하면 사이트에 온라인으로 접속할 수 있습니다) 어떤 이유로 든 Let 's Encrypt-initiated 취소가 발생했습니다). 갱신 작업을 위해 시간 내에 임의의 시간을 선택하십시오.

Michael Hampton이 언급했듯이 이름은 certbot으로 변경되었지만 여전히 자동 업데이트되는 -auto 옵션을 제공합니다. 이 certbot-auto명령을 실행하려면 루트 권한이 필요하므로 cron 스크립트의 행은 다음과 같아야합니다.

52 0,12 * * * root /full/path/to/certbot-auto renew --quiet

필자의 경우 certbot-auto스크립트는 git-user의 홈 디렉토리에 있습니다. 그러면 정확한 명령은

52 0,12 * * * root /home/git/certbot-auto renew --quiet

설명서의 예제는 혼동 될 수있는 점으로 표시된 상대 경로에 해당합니다.

./path/to/certbot-auto renew --quiet

인증서가 갱신 기한이 아닌 경우 아무 것도 발생하지 않을 경우 경로를 테스트하기 전에 셸에서 갱신 명령을 testrun해야합니다 ( --quiet무엇이 발생하는지 보려면 플래그 없이이 테스트를 실행 하십시오).

이 방법으로 인증서를 갱신 할 때 서버를 다시로드 할 필요는 없습니다. 올바르게 설정된 경우 라이브 인증서의 경로가 변경되지 않기 때문입니다.

아파치를 실행하는 경우에 해당합니다. nginx의 경우 다음과 같은 갱신 후크를 추가하십시오.

52 0,12 * * * root certbot renew --renew-hook 'service nginx reload'

1
나는 이것이 어떻게 설명되는지, 서비스를 다시 시작할 필요가 없다는 것을 좋아한다 (누군가가 무언가를하고 있다면 하루에 두 번 기회를 잡으면 엉망이 될 수있다).
Gusstavv Gil

4
이것은 사실이 아니다 - 이다 적어도 Nginx와 함께, 서버를 다시로드 할 필요 - nginx를 초기 인증서를 캐시 표시하고 새 인증서 경우에도 파일의 변경 사항을 등록하지 않습니다. --renew-hook성공적인 갱신 후에 만 ​​다시 시작하는 데 대한 정보는 guyrutenberg.com/2017/01/01/…
Whatcould

17

아무것도 설정할 필요가 없습니다. certbot의 최근 데비안 / 우분투 설치는 systemd 타이머와 cron 작업을 설치해야합니다 (cron 작업은 certbotsystemd가 활성화되어 있지 않은 경우 에만 실행 되므로 둘 다 실행되지는 않습니다).

시스템 타이머

명령을 사용하여 systemctl list-timers(또는 systemctl list-timers --all비활성 타이머를 표시하려는 경우) 시스템 타이머를 확인할 수 있습니다 . 이 같은:

% sudo systemctl list-timers
NEXT                         LEFT        LAST                         PASSED      UNIT                         ACTIVATES
Fri 2018-08-03 06:17:25 UTC  10h left    Thu 2018-08-02 06:27:13 UTC  13h ago     apt-daily-upgrade.timer      apt-daily-upgrade.service
Fri 2018-08-03 11:43:29 UTC  15h left    Thu 2018-08-02 16:54:52 UTC  3h 7min ago certbot.timer                certbot.service
Fri 2018-08-03 12:44:58 UTC  16h left    Thu 2018-08-02 19:14:58 UTC  47min ago   apt-daily.timer              apt-daily.service
Fri 2018-08-03 19:43:44 UTC  23h left    Thu 2018-08-02 19:43:44 UTC  18min ago   systemd-tmpfiles-clean.timer systemd-tmpfiles-clean.service
Mon 2018-08-06 00:00:00 UTC  3 days left Mon 2018-07-30 00:00:09 UTC  3 days ago  fstrim.timer                 fstrim.service

certbot 타이머가 여기에 있어야하며에 /lib/systemd/system/certbot.timer지정된 명령을 실행합니다./lib/systemd/system/certbot.service

certbot.timer 최대 12 시간 (43200 초)의 임의 지연 후 오전 12시와 오후 12시에`certbot.service를 실행합니다.

# cat /lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true

[Install]
WantedBy=timers.target

certbot.service갱신 명령을 실행합니다.

# cat /lib/systemd/system/certbot.service
[Unit]
Description=Certbot
Documentation=file:///usr/share/doc/python-certbot-doc/html/index.html
Documentation=https://letsencrypt.readthedocs.io/en/latest/
[Service]
Type=oneshot
ExecStart=/usr/bin/certbot -q renew
PrivateTmp=true

크론 직업

다른 사람들이 언급했듯이 cron 작업도 다음과 같이 설치됩니다 /etc/cron.d/certbot.

# Eventually, this will be an opportunity to validate certificates
# haven't been revoked, etc.  Renewal will only occur if expiration
# is within 30 days.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(43200))' && certbot -q renew

이것은하고있다 :

  • test -x /usr/bin/certbot -a \! -d /run/systemd/system- /usr/bin/certbot실행 파일이고 디렉토리 /run/systemd/system아닌지 확인하십시오 . 이 검사가 성공하면 다음 비트 만 계속하십시오.
    • 검사의 체계화 된 부분은 systemd가 실행 중이면 cron 작업에서 certbot을 실행하지 말고 타이머에 그대로 두십시오.
  • perl -e 'sleep int(rand(43200))' -0 초에서 12 시간 사이의 임의의 수면 (43200 = 12 x 60 x 60).
  • certbot -q renew인증서를 확인하고 필요한 경우 갱신하십시오. -q플래그는 "조용한"입니다 - 오류가 발생하지 않는 한 출력을 생성하지 않습니다.

systemd로 인해 실행되지 않을 때 cron 작업에 혼란 스러웠습니다 .certbot은 어떻게 실행됩니까? 이 포럼 게시물 에서이 답변을 기반으로 한 답변을 찾았 습니다.


1
"아무것도 설정할 필요가 없습니다."최근에 인증서가 만료되어 약 3 개월 전에 certbot을 설치했습니다. /etc/cron.d/certbot는 존재 하지만 systemctl list-timers표시 certbot.timer하지만 내 인증서는 갱신되지 않았습니다. certbot수동으로 실행하면 정상적으로 작동하므로 무슨 일인지 모르겠습니다. 오래된 학교 crontab항목을 추가했습니다 .
Dan Dascalescu

이것은 가장 최신의 정답이지만 실행중인 거리에 따라 다릅니다. certbot.eff.org/docs/using.html#id8
olive_tree

"cron 작업은 systemd가 활성화되지 않은 경우에만 실행됩니다". 이 "우선 순위"에 대한 문서를 찾는 데 도움을 줄 수 있습니까?
titus

@titus 설명은 cron 작업이 먼저 a test를 실행하여 systemd가 활성화되어 있는지 확인하고 활성화되어 있으면 cron 작업이 실행되지 않고 즉시 종료됩니다 certbot. cron 작업에 대한 텍스트를 참조하십시오. 보다 정확한 텍스트를 편집하겠습니다.
Hamish Downer

5

LetsEncrypt 인증서 갱신의 경우 일반적으로 getssl을 사용 합니다 . SSH 연결을 통해 다른 컴퓨터에 인증서를 설치할 수도있는 매우 편리한 쉘 래퍼입니다.

크론 항목은 다음과 같습니다.

01 23 * * * root /root/scripts/getssl/getssl -u -a -q >>/var/log/getssl.log 2>&1 ; /usr/sbin/apache2ctl graceful

이미 제안했듯이 매일 또는 하루에 두 번 더 잘 실행해야합니다.


3

glaux에서 이미 언급했듯이 :

참고 : cron 또는 시스템 작업을 설정하는 경우 하루에 두 번 실행하는 것이 좋습니다 (인증서 갱신 또는 해지 기한까지는 아무 것도하지 않지만 정기적으로 실행하면 사이트에 머무를 기회가 생길 수 있습니다) Let 's Encrypt 시작 취소가 어떤 이유로 든 발생한 경우 온라인). 갱신 작업을 위해 시간 내에 임의의 시간을 선택하십시오.

출처 : https://certbot.eff.org/all-instructions/#debian-8-jessie-apache

그래서 나는 이것을 사용하여 끝났다 (실행은 하루에 두 번, 01:00과 13:00에 매일) :

6 1,13 * * * certbot renew --post-hook "service apache2 restart"

또는 더 나은 :

6 1,13 * * * certbot renew --renew-hook "service apache2 restart"

나는 테스트하지 않았지만 이것이 작동해야합니다.

6 1,13 * * * certbot renew --post-hook "/etc/init.d/apache2 restart"
6 1,13 * * * certbot renew --renew-hook "/etc/init.d/apache2 restart"

--pre-hook 및 --post-hook 후크는 모든 갱신 시도 전후에 실행됩니다. 갱신이 완료된 후에 만 ​​후크를 실행하려면 이와 같은 명령에서 --renew-hook을 사용하십시오.

출처 : https://certbot.eff.org/docs/using.html


1
"갱신 작업을 위해 1 시간 내에 임의의 시간을 선택하십시오."
Isius

1
위의 참고 사항에 --renew-hook따라 인증서를 실제로 갱신 할 때만 서버를 다시 시작하는을 사용하는 것이 좋습니다 .
Whatcould

@Isius 덕분에 임의의 분 (6)으로 변경했습니다.
Tadej

1
@JedatKinports :해야하지가 --post-hook--renew-hookservice apache2 restart대신 service restart apache2?
Paul Ratazzi

1
명령은 service apache2 restart입니다 ! 는 service restart apache2올바른 명령 / 서비스하지 않습니다.
GTodorov 2016 년

1

이것이 내가 사용하는 것입니다 :

/opt/letsencrypt/letsencrypt-auto renew

출력을 다음과 같이 제공합니다.

Upgrading certbot-auto 0.8.1 to 0.9.1...
Replacing certbot-auto...
Creating virtual environment...
...
new certificate deployed with reload of apache server; fullchain is
/etc/letsencrypt/live/host.simplecoin.cz/fullchain.pem
-------------------------------------------------------------------------------

Congratulations, all renewals succeeded. The following certs have been renewed:
  /etc/letsencrypt/live/host.simplecoin.cz/fullchain.pem (success)

그리고 아파치가 이미 다시 시작되었다는 말은 다시 할 필요가 없습니다. 다시 실행하면 :

Cert not yet due for renewal

따라서 매일 인증서를 갱신하는 것은 문제가되지 않습니다.

@daily /opt/letsencrypt/cronautorenew.sh

스크립트를 사용하여 별도의 파일로 로깅을 조정하므로 다음은 cronautorenew.sh입니다.

#!/usr/bin/env bash
printf "\nattempt to renew certificates" >>/var/log/letsencrypt_cron.log 2>&1
date >>/var/log/letsencrypt_cron.log 2>&1
/opt/letsencrypt/letsencrypt-auto renew >>/var/log/letsencrypt_cron.log 2>&1
printf "renew finished\n" >>/var/log/letsencrypt_cron.log 2>&1

1

다른 회원들은 이미 훨씬 더 자세한 답변을 제공했습니다. 하지만 여기서 언급해야 할 것 같습니다.

certbot 버전 0.21.1부터 --renew-hook플래그가 --deploy-hook 더 이상 사용되지 않는 플래그를 사용하지 않는지 확인하십시오.

certbot renew --deploy-hook "systemctl restart myservice"

0

EFF certbot 가이드 에 따르면

많은 Linux 배포판은 시스템 패키지 관리자를 통해 설치된 패키지를 사용할 때 자동 갱신을 제공합니다.

당신이 당신의 시스템이 이미 자동화 여부를 확실하지 않은 경우, 시스템의 확인 의 crontab을 일반적으로 ( /etc/crontab/그리고 /etc/cron.*/* $ crontab -lsystemd 타이머 $ systemctl list-timers .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.