Đâ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
Đâ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
Câu trả lời:
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.timer
và systemctl 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.
--renew-hook
thay vì --post-hook
, chỉ khởi động lại nếu chứng chỉ được gia hạn thành công.
certbot renew
sẽ chỉ hoạt động ™
ExecStartPost=/usr/sbin/service nginx reload
. Đã làm cho tôi!
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 service
lệnh bị phản đối; nó sẽ không ở đây mãi mãi Chuyển sang các systemctl
lệnh tương ứng .
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.
certbot renew
nếu /run/systemd/system
có - đ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 .
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.
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-auto
lệ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-auto
tậ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ó --quiet
cờ để 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'
--renew-hook
để chỉ khởi động lại sau khi gia hạn thành công: guysrutenberg.com/2017/01/01/ Đường
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 certbot
nếu systemd không hoạt động, do đó bạn không chạy cả hai).
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 --all
nế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.timer
và 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
và certbot.service
sẽ 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
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/certbot
là một tập tin thực thi và điều đó /run/systemd/system
là khô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.
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 renew
kiể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 -q
lá 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.
/etc/cron.d/certbot
tồn tại, systemctl list-timers
cho thấy certbot.timer
, nhưng certs của tôi không được gia hạn. Chạy certbot
thủ 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 crontab
mục nhập trường cũ .
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.
Để 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.
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.
--renew-hook
khi khởi động lại máy chủ của mình khi chứng chỉ thực sự được gia hạn.
--post-hook
và --renew-hook
được service apache2 restart
thay vì service restart apache2
?
service restart apache2
không phải là đúng lệnh / dịch vụ.
Đâ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
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"
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/
và /etc/cron.*/*
$ crontab -l
và giờ systemd $ systemctl list-timers
.
/etc/cron.d/certbot