Công việc định kỳ cho việc đổi mới mã hóa


93

Đây có phải là cách chính xác để đặt cron cho việc gia hạn chứng chỉ Let Encrypt trong Apache2 không? Tôi sử dụng Ubuntu 16.04.

@monthly letsencrypt renew && service apache2 reload

6
Là một trong những câu trả lời dưới đây, certbot v0.19.0 (và có thể một số trước đó) đã tạo một mục crontab @/etc/cron.d/certbot
xgMz

Ngoài ra, plugin apache certbot với xác thực tls-sni sẽ tải lại apache như một phần của quy trình xác thực sau khi chứng chỉ mới được lấy.
xgMz

Có một câu trả lời dưới đây rất quan trọng đối với các bản cài đặt mới (kể từ JAN 2019), certbot tự động thêm bộ đếm thời gian hệ thống và lịch trình công việc cron để bạn không cần thiết lập cron.
Cory Robinson

Câu trả lời:


145

Hàng tháng không đủ thường xuyên. Kịch bản này nên chạy ít nhất hàng tuần và tốt nhất là hàng ngày. Hãy nhớ rằng certs không được gia hạn trừ khi chúng sắp hết hạn và hàng tháng sẽ khiến các certs hiện tại của bạn đôi khi bị hết hạn trước khi chúng được gia hạn.

Tên của chương trình là certbot, được đổi tên từ letsencrypt. Nếu bạn vẫn đang sử dụng letsencrypt, bạn cần cập nhật lên phiên bản hiện tại.

Ngoài những vấn đề đó, nó cũng giống như công việc định kỳ của tôi.

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

Lưu ý rằng trong 18.04 LTS, gói letencrypt đã được đổi tên (cuối cùng) thành certbot. Bây giờ nó bao gồm một bộ đếm thời gian systemd mà bạn có thể kích hoạt để lên lịch gia hạn certbot, với systemctl enable certbot.timersystemctl start certbot.timer. Tuy nhiên, Ubuntu không cung cấp cách chỉ định hook. Bạn sẽ cần thiết lập ghi đè certbot.serviceđể ghi đè ExecStart=bằng dòng lệnh mong muốn của mình cho đến khi Ubuntu sửa lỗi này.


3
Cửa sổ thời gian nào là "sắp hết hạn"?
Andre Figueiredo

3
Có thể tốt hơn cho người dùng --renew-hookthay vì --post-hook, chỉ khởi động lại nếu chứng chỉ được gia hạn thành công.
mwfearnley

6
Đối với apache / httpd, certbot renewsẽ chỉ hoạt động ™
aairey

1
Tôi chỉ muốn thêm, thay vì ghi đè ExecStart để tải lại nginx, chỉ cần thêm một dòng ExecStartPost vào certbot.service để tải lại máy chủ web của bạn sau khi hoàn thành : ExecStartPost=/usr/sbin/service nginx reload. Đã làm cho tôi!
JD Mallen

1
@JDMallen Sử dụng ExecStartPost=là một ý tưởng tốt. Tại sao tôi không nghĩ về điều đó? Nhưng hãy lưu ý rằng servicelệnh bị phản đối; nó sẽ không ở đây mãi mãi Chuyển sang các systemctllệnh tương ứng .
Michael Hampton

56

Tôi không có đủ danh tiếng để bình luận, vì vậy tôi sẽ trả lời ở đây. Gần đây tôi (tháng 10 năm 2017) đã cài đặt và chạy certbot trên máy chủ Ubuntu 16.04 và một công việc định kỳ đổi mới được tạo tự động /etc/cron.d/certbot.

Đây là công việc định kỳ đã được tạo:

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

Sẽ là một ý tưởng tốt để kiểm tra, nếu tệp này đã tồn tại trước khi tạo một mục crontab.


1
Tôi thấy tôi cũng có cái này sau khi chạy certbot. Rất đẹp cho phép mã hóa đã làm điều này! Đó là một dự án tuyệt vời.
Bjorn

7
Điều đáng lưu ý là công việc định kỳ trên sẽ không chạy certbot renewnếu /run/systemd/systemcó - điều này là do thay vào đó, bộ đếm thời gian systemd đang chạy certbot - đọc thêm về certbot và bộ định thời systemd ở đây .
Hamish Downer

Cảm ơn đã đề cập rằng một cronjob đã được cài đặt. Tôi đã không nhận thức được điều đó cho đến khi tôi đọc bài viết của bạn.
NilsB

1
Đối với bất cứ ai tự hỏi, điều đó làm cho nó chạy mỗi 12 giờ. Câu trả lời khác 43 6 * * *sẽ khiến nó chạy mỗi ngày vào lúc 6:43 sáng. Mỗi ngày một lần là đủ, nhưng một trong hai hoạt động tốt.
orrd

42

Các tài liệu certbot khuyến cáo chạy kịch bản hai lần một ngày:

Ghi chú:

nếu bạn đang thiết lập một công việc cron hoặc systemd, chúng tôi khuyên bạn nên chạy nó hai lần mỗi ngày (nó sẽ không làm gì cho đến khi chứng chỉ của bạn được gia hạn hoặc bị thu hồi, nhưng việc chạy nó thường xuyên sẽ cho trang web của bạn cơ hội duy trì trực tuyến trong trường hợp một sự hủy bỏ do Encrypt khởi xướng đã xảy ra vì một số lý do). Vui lòng chọn một phút ngẫu nhiên trong giờ cho các nhiệm vụ gia hạn của bạn.

Như Michael Hampton đã đề cập, tên đã được đổi thành certbot, nhưng họ vẫn cung cấp tùy chọn -auto luôn tự cập nhật. Các certbot-autolệnh cần đặc quyền root để chạy, do đó dòng trong kịch bản cron của bạn sẽ giống như thế này:

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

Trong trường hợp của riêng tôi, certbot-autotập lệnh được đặt trong thư mục chính của người dùng git. Lệnh chính xác là sau đó

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

Lưu ý rằng ví dụ trong tài liệu tương ứng với một đường dẫn tương đối, như được chỉ ra bởi dấu chấm có thể gây nhầm lẫn:

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

Hãy chắc chắn kiểm tra lệnh gia hạn trong shell trước để kiểm tra đường dẫn, nếu chứng chỉ không phải là để gia hạn thì sẽ không có gì xảy ra (chạy thử nghiệm này mà không có --quietcờ để xem điều gì đang xảy ra).

Không nhất thiết phải tải lại máy chủ khi chứng chỉ được gia hạn theo cách này, vì đường dẫn đến chứng chỉ trực tiếp không thay đổi nếu được thiết lập chính xác.

Điều này đúng nếu bạn đang chạy apache - đối với nginx, hãy xem xét việc thêm móc gia hạn, chẳng hạn như:

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

1
Tôi thích cách giải thích điều này, không cần thiết phải khởi động lại dịch vụ (nó có thể gây rối nếu ai đó làm bất cứ điều gì trên đó, có cơ hội hai lần một ngày để bị bắt) và đề cập đến các đặc quyền cần thiết.
Gusstavv Gil

4
Điều này không đúng - nó cần thiết để tải lại máy chủ, ít nhất là với Nginx - nginx dường như bộ nhớ cache giấy chứng nhận ban đầu và không đăng ký một cert mới ngay cả khi những thay đổi tập tin. Xem bài đăng này để biết thông tin về việc sử dụng --renew-hookđể chỉ khởi động lại sau khi gia hạn thành công: guysrutenberg.com/2017/01/01/ Đường
Whatcould 18/8/17

17

Bạn không cần phải thiết lập bất cứ điều gì. Bất kỳ cài đặt certbot Debian / Ubuntu nào gần đây cũng nên cài đặt bộ đếm thời gian systemd và công việc cron (và công việc cron sẽ chỉ chạy certbotnếu systemd không hoạt động, do đó bạn không chạy cả hai).

hẹn giờ systemd

Bạn có thể kiểm tra bộ định thời systemd của mình bằng lệnh systemctl list-timers(hoặc systemctl list-timers --allnếu bạn cũng muốn hiển thị bộ định thời không hoạt động). Một cái gì đó như thế này:

% 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

Đồng hồ bấm giờ certbot sẽ ở đây /lib/systemd/system/certbot.timervà nó sẽ thực thi lệnh được chỉ định trong/lib/systemd/system/certbot.service

certbot.timer sẽ thực thi `certbot.service lúc 12 giờ sáng và 12 giờ đêm, sau một thời gian trễ ngẫu nhiên lên tới 12 giờ (43200 giây).

# 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.servicesẽ thực hiện lệnh gia hạn.

# 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

công việc lương thấp

Như những người khác đã đề cập, cũng có một công việc định kỳ được cài đặt trong /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

Đây là làm:

  • test -x /usr/bin/certbot -a \! -d /run/systemd/system- kiểm tra xem /usr/bin/certbotlà một tập tin thực thi và điều đó /run/systemd/systemkhông một thư mục. Chỉ tiếp tục đến bit tiếp theo nếu kiểm tra này thành công.
    • Phần systemd của kiểm tra có nghĩa là nếu systemd đang chạy, đừng chạy certbot từ công việc định kỳ - hãy để phần đó vào bộ đếm thời gian.
  • perl -e 'sleep int(rand(43200))' - ngủ một lượng ngẫu nhiên trong khoảng từ 0 giây đến 12 giờ (43200 = 12 x 60 x 60).
  • certbot -q renewkiểm tra giấy chứng nhận của bạn và gia hạn bất kỳ nếu cần thiết. Các -qlá cờ là "yên tĩnh" - không tạo ra bất kỳ đầu ra trừ khi có một lỗi.

Ban đầu tôi bị nhầm lẫn bởi công việc định kỳ vì nó sẽ không chạy do systemd, vậy certbot sẽ được chạy như thế nào? Tôi tìm thấy câu trả lời trong bài đăng diễn đàn này là những gì tôi dựa trên câu trả lời này.


1
"Bạn không cần phải thiết lập bất cứ điều gì" nhưng chứng chỉ của tôi đã hết hạn gần đây và tôi đã cài đặt certbot khoảng 3 tháng trước. /etc/cron.d/certbottồn tại, systemctl list-timerscho thấy certbot.timer, nhưng certs của tôi không được gia hạn. Chạy certbotthủ công hoạt động tốt, vì vậy tôi không biết chuyện gì đang xảy ra. Đã kết thúc thêm một crontabmục nhập trường cũ .
Dan Dascalescu

Đây là câu trả lời cập nhật và chính xác nhất nhưng với một lời cảnh báo rằng nó phụ thuộc vào việc bạn đang chạy ở đâu: certbot.eff.org/docs/USE.html#id8
olive_tree 22/11/18

"Và công việc định kỳ sẽ chỉ chạy nếu systemd không hoạt động". Bạn có thể giúp đỡ trong việc tìm kiếm một số tài liệu về "ưu tiên" này giải thích xin vui lòng?
Tít

@titus giải thích là công việc cron trước tiên chạy a testđể kiểm tra xem systemd có hoạt động không và nếu có, công việc cron ngay lập tức thoát ra mà không chạy certbot- xem văn bản về công việc cron. Tôi sẽ chỉnh sửa văn bản để chính xác hơn.
Hamish Downer

5

Để gia hạn chứng chỉ LetsEncrypt, tôi thường sử dụng gotsl . Nó là một trình bao bọc vỏ rất tiện dụng, thậm chí có thể cài đặt chứng chỉ trên các máy khác thông qua kết nối SSH.

Mục cron là như sau:

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

Như đã đề xuất, bạn nên chạy nó hàng ngày hoặc thậm chí tốt hơn, hai lần một ngày.


3

Như đã được đề cập bởi glaux:

Lưu ý: nếu bạn đang thiết lập một công việc cron hoặc systemd, chúng tôi khuyên bạn nên chạy nó hai lần mỗi ngày (nó sẽ không làm gì cho đến khi chứng chỉ của bạn được gia hạn hoặc bị thu hồi, nhưng chạy nó thường xuyên sẽ cho trang web của bạn cơ hội ở lại trực tuyến trong trường hợp thu hồi do Encrypt khởi xướng đã xảy ra vì một số lý do). Vui lòng chọn một phút ngẫu nhiên trong giờ cho các nhiệm vụ gia hạn của bạn.

Nguồn: https://certbot.eff.org/all-inemony/#debian-8-jessie-apache

Vì vậy, tôi đã kết thúc việc sử dụng này (chạy là hai lần một ngày, lúc 01:00 và lúc 13:00 mỗi ngày):

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

hoặc thậm chí tốt hơn:

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

Tôi đã không kiểm tra nhưng điều này cũng hoạt động:

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 và --post-hook hook chạy trước và sau mỗi lần thử gia hạn. Nếu bạn muốn hook của mình chỉ chạy sau khi gia hạn thành công, hãy sử dụng --renew-hook trong một lệnh như thế này.

Nguồn: https://certbot.eff.org/docs/USE.html


1
"Vui lòng chọn một phút ngẫu nhiên trong giờ cho các nhiệm vụ gia hạn của bạn."
Isius

1
Theo lưu ý của tôi ở trên, bạn sẽ tốt hơn --renew-hookkhi khởi động lại máy chủ của mình khi chứng chỉ thực sự được gia hạn.
Có gì

@Isius cảm ơn, tôi đã thay đổi nó thành một phút ngẫu nhiên (6).
Tadej

1
@JedatKinports: nên không phải là --post-hook--renew-hookđược service apache2 restartthay vì service restart apache2?
Paul Ratazzi

1
Lệnh là dịch vụ apache2 khởi động lại ! Các service restart apache2không phải là đúng lệnh / dịch vụ.
GTodorov

1

Đây là những gì tôi sử dụng:

/opt/letsencrypt/letsencrypt-auto renew

cho đầu ra là:

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)

Và nó nói rằng apache đã được khởi động lại, vì vậy không cần phải làm lại. Nếu tôi chạy lại:

Cert not yet due for renewal

do đó, không có vấn đề gì để gia hạn chứng chỉ hàng ngày, sau đó, cron của tôi là:

@daily /opt/letsencrypt/cronautorenew.sh

Tôi sử dụng tập lệnh để điều chỉnh ghi nhật ký để tách tập tin, vì vậy đây là 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

Các thành viên khác đã cung cấp nhiều câu trả lời chi tiết hơn. Nhưng có vẻ như tôi nên đề cập đến nó ở đây.

Kể từ phiên bản certbot phiên bản 0.21.1 --renew-hookđược thay đổi thành --deploy-hook Đảm bảo bạn không sử dụng cờ không dùng nữa.

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

0

Theo hướng dẫn của EFF certbot

Nhiều bản phân phối Linux cung cấp gia hạn tự động khi bạn sử dụng các gói được cài đặt thông qua trình quản lý gói hệ thống của chúng.

Nếu bạn không chắc chắn có hay không hệ thống của bạn đã này đã tự động, kiểm tra hệ thống của bạn crontab (thường trong /etc/crontab//etc/cron.*/* $ crontab -lgiờ systemd $ systemctl list-timers .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.