นี่เป็นวิธีที่ถูกต้องในการตั้งค่าcronสำหรับการต่ออายุใบรับรอง Let's Encrypt ใน Apache2 หรือไม่ ฉันใช้ Ubuntu 16.04
@monthly letsencrypt renew && service apache2 reload
นี่เป็นวิธีที่ถูกต้องในการตั้งค่าcronสำหรับการต่ออายุใบรับรอง Let's Encrypt ใน Apache2 หรือไม่ ฉันใช้ Ubuntu 16.04
@monthly letsencrypt renew && service apache2 reload
คำตอบ:
รายเดือนไม่บ่อยพอ สคริปต์นี้ควรทำงานอย่างน้อยสัปดาห์ละครั้งและควรมากกว่าทุกวัน โปรดจำไว้ว่า 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 จะแก้ไขสิ่งนี้
--renew-hook
แทนที่จะ--post-hook
รีสตาร์ทเฉพาะในกรณีที่ต่ออายุใบรับรองได้สำเร็จ
certbot renew
เพียงแค่จะใช้งานได้
ExecStartPost=/usr/sbin/service nginx reload
เพื่อโหลดเว็บเซิร์ฟเวอร์ของคุณหลังจากที่ทำ: ทำงานให้ฉัน!
ExecStartPost=
เป็นความคิดที่ดี ทำไมฉันไม่คิดอย่างนั้นล่ะ แต่ระวังว่าservice
คำสั่งนั้นเลิกใช้แล้ว มันจะไม่อยู่ตลอดไป สลับไปยังsystemctl
คำสั่งที่เกี่ยวข้อง
ฉันไม่มีชื่อเสียงพอที่จะแสดงความคิดเห็นดังนั้นฉันจะตอบที่นี่ ฉันเพิ่ง (ตุลาคม 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
certbot renew
ถ้า/run/systemd/system
เป็นปัจจุบัน - นี้เป็นเพราะแทนที่จะจับเวลา systemd กำลังทำงาน certbot - อ่านเพิ่มเติมเกี่ยวกับ certbot และ systemd จับเวลาที่นี่
43 6 * * *
จะทำให้มันทำงานทุกวันเวลา 6:43 น. วันละครั้งก็เพียงพอ แต่ก็ใช้ได้ดี
เอกสาร 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'
--renew-hook
เพื่อรีสตาร์ทเท่านั้นหลังจากการต่ออายุสำเร็จ: guyrutenberg.com/2017/01/01/…
คุณไม่ควรตั้งค่าอะไรเลย การติดตั้ง 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 ติดตั้งใน/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
คือไม่ไดเรกทอรี ทำต่อในบิตถัดไปถ้าการตรวจสอบนี้สำเร็จ
perl -e 'sleep int(rand(43200))'
- นอนสุ่มระหว่าง 0 วินาทีถึง 12 ชั่วโมง (43200 = 12 x 60 x 60)certbot -q renew
ตรวจสอบใบรับรองของคุณและต่ออายุถ้าจำเป็น การ-q
ตั้งค่าสถานะคือ "เงียบ" - ไม่สร้างผลลัพธ์ใด ๆ ยกเว้นว่ามีข้อผิดพลาดตอนแรกฉันสับสนกับงาน cron เพราะมันไม่ได้ทำงานเนื่องจาก systemd ดังนั้น certbot จะทำงานได้อย่างไร ฉันพบคำตอบในโพสต์ฟอรัมนี้ซึ่งเป็นคำตอบที่ฉันใช้
/etc/cron.d/certbot
มีอยู่systemctl list-timers
แสดงcertbot.timer
แต่ไม่มีการต่ออายุใบรับรองของฉัน การทำงานcertbot
ด้วยตนเองทำงานได้ดีดังนั้นฉันจึงไม่รู้ว่าเกิดอะไรขึ้น จบลงด้วยการเพิ่มcrontab
รายการโรงเรียนเก่า
test
เพื่อตรวจสอบว่า systemd ทำงานอยู่หรือไม่และถ้าเป็นเช่นนั้นงาน cron จะออกทันทีโดยไม่ทำงานcertbot
- ดูข้อความเกี่ยวกับงาน cron ฉันจะแก้ไขข้อความให้แม่นยำยิ่งขึ้น
สำหรับการต่ออายุใบรับรอง LetsEncrypt ผมมักใช้getssl มันเป็นเปลือกหุ้มที่มีประโยชน์มากซึ่งยังสามารถติดตั้งใบรับรองบนเครื่องอื่นผ่านการเชื่อมต่อ SSH
รายการ cron ดังต่อไปนี้:
01 23 * * * root /root/scripts/getssl/getssl -u -a -q >>/var/log/getssl.log 2>&1 ; /usr/sbin/apache2ctl graceful
ตามที่แนะนำไปแล้วคุณควรรันทุกวันหรือดีกว่าวันละสองครั้ง
ตามที่กล่าวไว้แล้วโดย 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 ในคำสั่งเช่นนี้
--renew-hook
ซึ่งจะรีสตาร์ทเซิร์ฟเวอร์ของคุณเฉพาะเมื่อมีการต่ออายุใบรับรองจริง
--post-hook
และ--renew-hook
ควรจะเป็นservice apache2 restart
แทนservice restart apache2
?
service restart apache2
ไม่ถูกต้องคำสั่ง / บริการ
นี่คือสิ่งที่ฉันใช้:
/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
สมาชิกคนอื่น ๆ ได้ให้คำตอบโดยละเอียดมากกว่านี้ แต่ดูเหมือนว่าฉันควรพูดถึงที่นี่
ในฐานะที่เป็น--renew-hook
ธงcertbot รุ่น 0.21.1 ถูกเปลี่ยนเป็น--deploy-hook
ตรวจสอบให้แน่ใจว่าคุณไม่ได้ใช้การตั้งค่าสถานะที่คัดค้าน
certbot renew --deploy-hook "systemctl restart myservice"
ดิสทริบิวชันลีนุกซ์หลายรุ่นมีการต่ออายุอัตโนมัติเมื่อคุณใช้แพ็คเกจที่ติดตั้งผ่านผู้จัดการแพ็คเกจระบบ
หากคุณไม่แน่ใจหรือไม่ว่าระบบของคุณได้อัตโนมัตินี้แล้วตรวจสอบระบบของคุณcrontab (โดยทั่วไปใน/etc/crontab/
และ/etc/cron.*/*
$ crontab -l
และจับเวลา systemd $ systemctl list-timers
/etc/cron.d/certbot