งาน Cron สำหรับการเข้ารหัสการต่ออายุของเรา


93

นี่เป็นวิธีที่ถูกต้องในการตั้งค่าcronสำหรับการต่ออายุใบรับรอง Let's Encrypt ใน Apache2 หรือไม่ ฉันใช้ Ubuntu 16.04

@monthly letsencrypt renew && service apache2 reload

6
ในฐานะที่เป็นหนึ่งในคำตอบที่ระบุไว้ด้านล่าง certbot v0.19.0 (และอาจจะก่อนหน้านี้) สร้างรายการ crontab แล้ว @/etc/cron.d/certbot
xgMz

นอกจากนี้ปลั๊กอิน certbot apache ที่มีการตรวจสอบความถูกต้องของ tls-sni จะโหลด apache ใหม่ซึ่งเป็นส่วนหนึ่งของขั้นตอนการตรวจสอบความถูกต้องหลังจากเรียกใบรับรองใหม่แล้ว
xgMz

มีคำตอบด้านล่างที่มีความสำคัญมากสำหรับการติดตั้งใหม่ (ตั้งแต่เดือนมกราคม 2019), certbot จะเพิ่มตัวจับเวลาระบบและกำหนดเวลางาน cron โดยอัตโนมัติเพื่อไม่ให้การติดตั้ง cron ในส่วนของคุณ
คอรีโรบินสัน

คำตอบ:


145

รายเดือนไม่บ่อยพอ สคริปต์นี้ควรทำงานอย่างน้อยสัปดาห์ละครั้งและควรมากกว่าทุกวัน โปรดจำไว้ว่า certs ไม่ได้รับการต่ออายุเว้นแต่จะใกล้หมดอายุและรายเดือนจะทำให้ certs ที่มีอยู่ของคุณหมดอายุแล้วเป็นครั้งคราวก่อนที่จะต่ออายุ

ชื่อของโปรแกรมคือซึ่งถูกเปลี่ยนชื่อจากcertbot letsencryptหากคุณยังใช้อยู่letsencryptคุณจะต้องอัปเดตเป็นเวอร์ชันปัจจุบัน

นอกเหนือจากปัญหาเหล่านั้นมันเป็นเรื่องเดียวกันกับงาน cron ของฉัน

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

โปรดทราบว่าใน 18.04 LTS แพ็คเกจ letsencrypt ได้รับการเปลี่ยนชื่อเป็น certbot (ในที่สุด) ตอนนี้มันมีตัวจับเวลา systemd ที่คุณสามารถเปิดใช้งานเพื่อกำหนดตารางการต่ออายุ certbot ด้วยและsystemctl enable certbot.timer systemctl start certbot.timerอย่างไรก็ตาม Ubuntu ไม่มีวิธีการระบุ hooks คุณจะต้องตั้งค่าการแทนที่certbot.serviceเพื่อแทนที่ExecStart=ด้วยบรรทัดคำสั่งที่คุณต้องการจนกว่า Ubuntu จะแก้ไขสิ่งนี้


3
ช่วงเวลาใดที่ "ใกล้ถึงเวลาหมดอายุ"
Andre Figueiredo

3
อาจเป็นการดีกว่าสำหรับผู้ใช้--renew-hookแทนที่จะ--post-hookรีสตาร์ทเฉพาะในกรณีที่ต่ออายุใบรับรองได้สำเร็จ
mwfearnley

6
สำหรับ apache / httpd certbot renewเพียงแค่จะใช้งานได้
aairey

1
ฉันแค่อยากจะเพิ่มมากกว่าเอาชนะ ExecStart เพื่อโหลด Nginx เพียงเพิ่มสาย ExecStartPost เพื่อ certbot.service ExecStartPost=/usr/sbin/service nginx reloadเพื่อโหลดเว็บเซิร์ฟเวอร์ของคุณหลังจากที่ทำ: ทำงานให้ฉัน!
JD Mallen

1
@JDMallen ใช้ExecStartPost=เป็นความคิดที่ดี ทำไมฉันไม่คิดอย่างนั้นล่ะ แต่ระวังว่าserviceคำสั่งนั้นเลิกใช้แล้ว มันจะไม่อยู่ตลอดไป สลับไปยังsystemctlคำสั่งที่เกี่ยวข้อง
Michael Hampton

56

ฉันไม่มีชื่อเสียงพอที่จะแสดงความคิดเห็นดังนั้นฉันจะตอบที่นี่ ฉันเพิ่ง (ตุลาคม 2017) ติดตั้งและวิ่ง certbot บน Ubuntu 16.04 เซิร์ฟเวอร์และงานต่ออายุ cron /etc/cron.d/certbotถูกสร้างขึ้นโดยอัตโนมัติ

นี่คืองาน cron ที่ถูกสร้างขึ้น:

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
มันคุ้มค่าที่จะรับรู้ว่างาน cron ดังกล่าวข้างต้นจะไม่ทำงาน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 เริ่มต้นเกิดขึ้นด้วยเหตุผลบางอย่าง) โปรดเลือกนาทีแบบสุ่มภายในหนึ่งชั่วโมงสำหรับงานต่ออายุของคุณ

ดังที่ Michael Hampton กล่าวถึงชื่อเปลี่ยนเป็น certbot แต่พวกเขายังคงมีตัวเลือก - อัตโนมัติที่ปรับปรุงตัวเองอยู่เสมอ certbot-autoคำสั่งต้องสิทธิ์รากในการทำงานเพื่อให้เส้นในสคริปต์ cron ของคุณควรมีลักษณะบางอย่างเช่นนี้

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

ในกรณีของตัวเองcertbot-autoสคริปต์จะถูกวางไว้ในไดเรกทอรีบ้านของผู้ใช้คอมไพล์ คำสั่งที่แน่นอนนั้น

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

โปรดทราบว่าตัวอย่างในเอกสารประกอบสอดคล้องกับเส้นทางสัมพัทธ์ตามที่ระบุโดยจุดที่อาจทำให้สับสน:

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

อย่าลืมทดสอบคำสั่งต่ออายุในเชลล์ล่วงหน้าเพื่อทดสอบเส้นทางหากใบรับรองไม่ครบกำหนดจะไม่เกิดการต่ออายุใด ๆ (เรียกใช้การทดสอบนี้โดยไม่มีการ--quietตั้งค่าสถานะเพื่อดูว่าเกิดอะไรขึ้น)

ไม่จำเป็นต้องทำการรีโหลดเซิร์ฟเวอร์เมื่อมีการต่ออายุใบรับรองด้วยวิธีนี้เนื่องจากเส้นทางไปยังใบรับรองสดจะไม่เปลี่ยนแปลงหากตั้งค่าอย่างถูกต้อง

สิ่งนี้เป็นจริงถ้าคุณใช้ apache - สำหรับ nginx ให้ลองเพิ่ม hook ใหม่เช่น:

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 Debian / Ubuntu ล่าสุดใด ๆ ควรติดตั้งตัวจับเวลา systemd และงาน cron (และงาน cron จะทำงานก็ต่อcertbotเมื่อ systemd ไม่ทำงานดังนั้นคุณจึงไม่ได้ทำงานทั้งสองอย่าง)

ระบบจับเวลา

คุณสามารถตรวจสอบตัวจับเวลา systemd ของคุณโดยใช้คำสั่ง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 จะดำเนินการ `certbot.service เวลา 12.00 น. และ 12.00 น. หลังจากการสุ่มล่าช้าสูงสุด 12 ชั่วโมง (43200 วินาที)

# 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

ดังที่คนอื่น ๆ พูดถึงนอกจากนี้ยังมีงาน 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 ของการตรวจสอบอย่างมีประสิทธิภาพหมายความว่าถ้า systemd กำลังทำงานอยู่อย่าเรียกใช้ certbot จากงาน cron - ปล่อยให้ตัวจับเวลา
  • perl -e 'sleep int(rand(43200))' - นอนสุ่มระหว่าง 0 วินาทีถึง 12 ชั่วโมง (43200 = 12 x 60 x 60)
  • certbot -q renewตรวจสอบใบรับรองของคุณและต่ออายุถ้าจำเป็น การ-qตั้งค่าสถานะคือ "เงียบ" - ไม่สร้างผลลัพธ์ใด ๆ ยกเว้นว่ามีข้อผิดพลาด

ตอนแรกฉันสับสนกับงาน cron เพราะมันไม่ได้ทำงานเนื่องจาก systemd ดังนั้น certbot จะทำงานได้อย่างไร ฉันพบคำตอบในโพสต์ฟอรัมนี้ซึ่งเป็นคำตอบที่ฉันใช้


1
"คุณไม่ควรตั้งค่าอะไร" แต่ใบรับรองของฉันหมดอายุเมื่อเร็ว ๆ นี้และฉันติดตั้ง certbot เมื่อประมาณ 3 เดือนที่แล้ว /etc/cron.d/certbotมีอยู่systemctl list-timersแสดงcertbot.timerแต่ไม่มีการต่ออายุใบรับรองของฉัน การทำงานcertbotด้วยตนเองทำงานได้ดีดังนั้นฉันจึงไม่รู้ว่าเกิดอะไรขึ้น จบลงด้วยการเพิ่มcrontabรายการโรงเรียนเก่า
Dan Dascalescu

นี่คือคำตอบล่าสุดและคำตอบที่ถูกต้อง แต่มีข้อแม้ที่ขึ้นอยู่กับสิ่งที่คุณกำลังทำงาน: certbot.eff.org/docs/using.html#id8
olive_tree

"และงาน cron จะทำงานก็ต่อเมื่อ systemd ไม่ทำงาน" คุณช่วยในการหาเอกสารเกี่ยวกับ "ลำดับความสำคัญ" นี้อธิบายได้โปรด?
ตัส

@ คำอธิบายคือว่างาน cron รัน a เป็นครั้งแรกtestเพื่อตรวจสอบว่า systemd ทำงานอยู่หรือไม่และถ้าเป็นเช่นนั้นงาน cron จะออกทันทีโดยไม่ทำงานcertbot- ดูข้อความเกี่ยวกับงาน cron ฉันจะแก้ไขข้อความให้แม่นยำยิ่งขึ้น
Hamish Downer

5

สำหรับการต่ออายุใบรับรอง LetsEncrypt ผมมักใช้getssl มันเป็นเปลือกหุ้มที่มีประโยชน์มากซึ่งยังสามารถติดตั้งใบรับรองบนเครื่องอื่นผ่านการเชื่อมต่อ SSH

รายการ cron ดังต่อไปนี้:

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

ตามที่แนะนำไปแล้วคุณควรรันทุกวันหรือดีกว่าวันละสองครั้ง


3

ตามที่กล่าวไว้แล้วโดย glaux:

หมายเหตุ: หากคุณกำลังตั้งค่างาน cron หรือ systemd เราขอแนะนำให้รันสองครั้งต่อวัน (จะไม่ทำอะไรเลยจนกว่าใบรับรองของคุณจะถึงกำหนดต่ออายุหรือเพิกถอน แต่การเปิดใช้งานเป็นประจำจะทำให้ไซต์ของคุณมีโอกาส ออนไลน์ในกรณีที่มีการเพิกถอนการเข้ารหัสโดยเริ่มต้นด้วยเหตุผลบางประการ) โปรดเลือกนาทีแบบสุ่มภายในหนึ่งชั่วโมงสำหรับงานต่ออายุของคุณ

ที่มา: 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 hooks ทำงานก่อนและหลังการพยายามต่ออายุทุกครั้ง หากคุณต้องการให้ hook ของคุณทำงานหลังจากการต่ออายุสำเร็จให้ใช้ --renew-hook ในคำสั่งเช่นนี้

ที่มา: https://certbot.eff.org/docs/using.html


1
"โปรดเลือกนาทีแบบสุ่มภายในหนึ่งชั่วโมงสำหรับงานต่ออายุของคุณ"
Isius

1
ตามหมายเหตุของฉันข้างต้นคุณจะดีขึ้นด้วย--renew-hookซึ่งจะรีสตาร์ทเซิร์ฟเวอร์ของคุณเฉพาะเมื่อมีการต่ออายุใบรับรองจริง
อะไร

@Isius ขอบคุณฉันเปลี่ยนเป็นนาทีสุ่ม (6)
Tadej

1
@JedatKinports: ไม่ควร--post-hookและ--renew-hookควรจะเป็นservice apache2 restartแทนservice restart apache2?
Paul Ratazzi

1
คำสั่งคือapache2 บริการเริ่มต้นใหม่ ! service restart apache2ไม่ถูกต้องคำสั่ง / บริการ
GTodorov

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

ดังนั้นจึงไม่มีปัญหาในการต่ออายุใบรับรองรายวัน cron ของฉันคือ:

@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

สมาชิกคนอื่น ๆ ได้ให้คำตอบโดยละเอียดมากกว่านี้ แต่ดูเหมือนว่าฉันควรพูดถึงที่นี่

ในฐานะที่เป็น--renew-hookธงcertbot รุ่น 0.21.1 ถูกเปลี่ยนเป็น--deploy-hook ตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้การตั้งค่าสถานะที่คัดค้าน

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

0

ตามคู่มือ certbot EFF

ดิสทริบิวชันลีนุกซ์หลายรุ่นมีการต่ออายุอัตโนมัติเมื่อคุณใช้แพ็คเกจที่ติดตั้งผ่านผู้จัดการแพ็คเกจระบบ

หากคุณไม่แน่ใจหรือไม่ว่าระบบของคุณได้อัตโนมัตินี้แล้วตรวจสอบระบบของคุณcrontab (โดยทั่วไปใน/etc/crontab/และ/etc/cron.*/* $ crontab -lและจับเวลา systemd $ systemctl list-timers

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.