क्रोन जॉब चलो रिन्यूअल को एनक्रिप्ट करते हैं


93

क्या Apache2 में Let’s Encrypt cert के नवीनीकरण के लिए क्रोन सेट करने का यह सही तरीका है ? मैं Ubuntu 16.04 का उपयोग करता हूं।

@monthly letsencrypt renew && service apache2 reload

6
जैसा कि नीचे दिए गए उत्तर में से एक है, सर्टिफिकेट v0.19.0 (और शायद कुछ पहले) पहले से ही crontab प्रविष्टि @/etc/cron.d/certbot
xgMz

इसके अलावा, tls-sni सत्यापन के साथ सर्टिफिकेट अपाचे प्लगइन नए प्रमाणपत्र के पुनः प्राप्त होने के बाद सत्यापन प्रक्रिया के भाग के रूप में अपाचे को फिर से लोड करेगा।
xgMz

नीचे एक उत्तर दिया गया है जो नई इंस्टॉल (JAN 2019 के अनुसार) के लिए बहुत महत्वपूर्ण है, सर्टिफिकेट स्वचालित रूप से सिस्टम टाइमर और क्रोन जॉब शेड्यूल जोड़ता है ताकि आपके हिस्से पर क्रोन सेटअप की आवश्यकता न हो।
कोरी रॉबिन्सन

जवाबों:


144

मासिक अक्सर पर्याप्त नहीं होता है। यह स्क्रिप्ट कम से कम साप्ताहिक, और अधिमानतः दैनिक रूप से चलना चाहिए। याद रखें कि जब तक वे समाप्ति के करीब नहीं होते हैं, तब तक नवीकरण नहीं किया जाता है, और मासिक आपके मौजूदा सिरे को कभी-कभी समाप्त होने से पहले ही नवीनीकृत हो जाएगा।

कार्यक्रम का नाम है certbot, जिसका नाम बदल दिया गया था letsencrypt। यदि आप अभी भी उपयोग कर रहे हैं letsencrypt, तो आपको वर्तमान संस्करण में अपडेट करने की आवश्यकता है।

उन मुद्दों के अलावा, यह मेरी क्रोन नौकरियों के समान है।

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

ध्यान दें कि 18.04 LTS में letencrypt संकुल को (अंत में) नाम बदलकर सर्टिफिकेट दिया गया है। इसमें अब एक सिस्टम टाइमर शामिल है, जिसे आप सर्टिफिकेट रिन्यूअल को शेड्यूल करने में सक्षम कर सकते हैं, के साथ systemctl enable certbot.timerऔर systemctl start certbot.timer। हालांकि, उबंटू ने हुक को निर्दिष्ट करने का एक तरीका प्रदान नहीं किया। जब तक उबंटू इसे ठीक नहीं करता, आपको अपनी इच्छित कमांड लाइन के साथ certbot.serviceओवरराइड करने के लिए एक ओवरराइड सेट करना ExecStart=होगा।


3
"समाप्ति के निकट" किस समय की खिड़की है?
आंद्रे फिगयेरियो

3
इसके --renew-hookबजाय उपयोगकर्ता के लिए बेहतर हो सकता है --post-hook, केवल तभी पुनरारंभ करें जब प्रमाणपत्र सफलतापूर्वक नवीनीकृत हो जाए।
mwfearnley

6
अपाचे / httpd के लिए, certbot renewबस काम करेंगे ™
aireirey

1
मैं सिर्फ एक्सनेस्टार्ट को ओवरगाइड करने के बजाय nginx को ओवरराइड करने के बजाय जोड़ना चाहता था, यह करने के बाद अपने वेबसर्वर को पुनः लोड करने के लिए certbot.service में एक ExecStartPost लाइन जोड़ें ExecStartPost=/usr/sbin/service nginx reload:। मेरे लिए काम किया!
जद मल्लेन

1
@JDMallen का उपयोग करना ExecStartPost=एक अच्छा विचार है। मैंने ऐसा क्यों नहीं सोचा? लेकिन इस बात का ध्यान रखें कि serviceकमांड को हटा दिया जाए; यह हमेशा के लिए नहीं होगा। इसी systemctlकमांड पर स्विच करें ।
माइकल हैम्पटन

56

मेरे पास टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है, इसलिए मैं यहां जवाब दूंगा। मैंने हाल ही में (अक्टूबर 2017) एक Ubuntu 16.04 सर्वर पर सर्टिफिकेट स्थापित और चलाया और एक नवीकरण क्रोन जॉब स्वचालित रूप से बनाया गया था /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

यह जांचना एक अच्छा विचार होगा, अगर यह फ़ाइल एक क्रॉस्टैब प्रविष्टि बनाने से पहले ही मौजूद है।


1
मैंने देखा कि मेरे पास सर्टिफिकेट चलाने के बाद भी यही था। बहुत अच्छा है जो एन्क्रिप्ट करने देता है! बहुत अच्छा प्रोजेक्ट है।
ब्योर्न

7
यह ध्यान रखें कि इसके बाद के संस्करण क्रॉन जॉब जा रहा लायक है नहीं होगा चलाने certbot renewअगर /run/systemd/systemमौजूद है - इस वजह से बजाय एक systemd टाइमर certbot चल रहा है - certbot और systemd टाइमर के बारे में यहाँ और अधिक पढ़
हामिश डाउनर

यह उल्लेख करने के लिए धन्यवाद कि एक क्रोनजॉब पहले से ही स्थापित किया गया था। मुझे तब तक इस बात की जानकारी नहीं थी कि मैं आपकी पोस्ट को पढ़ता हूँ।
NilsB

1
किसी को भी आश्चर्य होता है, कि यह हर 12 घंटे चलता है। अन्य उत्तर 43 6 * * *इसे हर दिन सुबह 6:43 बजे चलाते हैं। दिन में एक बार पर्याप्त होना चाहिए, लेकिन या तो एक ठीक काम करता है।
orrd

42

Certbot प्रलेखन दिन में दो बार स्क्रिप्ट चलाने की सिफारिश की:

ध्यान दें:

यदि आप एक क्रोन या सिस्टमड जॉब सेट कर रहे हैं, तो हम इसे प्रति दिन दो बार चलाने की सलाह देते हैं (यह तब तक कुछ भी नहीं करेगा जब तक आपके प्रमाणपत्र नवीनीकरण या निरस्त होने के कारण नहीं होंगे, लेकिन इसे नियमित रूप से चलाने से आपकी साइट को ऑनलाइन रहने का मौका मिलेगा। केस लेट्स एनक्रिप्टेड-शुरू किए गए निरसन किसी कारण से हुआ)। कृपया अपने नवीनीकरण कार्यों के लिए घंटे के भीतर एक यादृच्छिक मिनट का चयन करें।

जैसा कि माइकल हैम्पटन का उल्लेख है कि नाम बदलकर सर्टिफिकेट कर दिया गया है, लेकिन वे अभी भी -ऑटो विकल्प प्रदान करते हैं जो खुद को अपडेट रखता है। certbot-autoआदेश, चलाने के लिए रूट विशेषाधिकार की जरूरत है ताकि अपने क्रॉन स्क्रिप्ट में लाइन कुछ इस तरह दिखना चाहिए:

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

पथ का परीक्षण करने के लिए पहले से ही शेल में नवीनीकृत कमांड को फिर से जांचना सुनिश्चित करें, अगर प्रमाणपत्र नवीनीकरण के कारण नहीं है तो कुछ भी नहीं होगा ( --quietजो हो रहा है उसे देखने के लिए ध्वज के बिना यह परीक्षण चलाएं )।

सर्टिफिकेट को इस तरह से रिन्यू करने पर सर्वर को फिर से लोड करना कड़ाई से जरूरी नहीं है, क्योंकि अगर सही तरीके से सेट किया गया तो लाइव सर्टिफिकेट का रास्ता नहीं बदलता है।

यह सच है अगर आप अपाचे चला रहे हैं - नगनेक्स के लिए, एक नवीनीकरण हुक जोड़ने पर विचार करें, जैसे:

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

1
मुझे यह पसंद है कि इसे कैसे समझाया जाए, सेवा पुनरारंभ की आवश्यकता नहीं है (यह गड़बड़ कर सकता है कि कोई व्यक्ति इस पर कुछ भी कर रहा है, दिन में दो बार पकड़े जाने का मौका है) और विशेषाधिकारों का उल्लेख करना चाहिए।
गुस्तावव गिल

4
यह सच नहीं है - यह है कम से कम Nginx के साथ सर्वर फिर से लोड करने के लिए आवश्यक - nginx प्रारंभिक प्रमाणपत्र कैश करने के लिए प्रकट होता है और एक नया प्रमाणपत्र भले ही फ़ाइल परिवर्तन रजिस्टर नहीं है। --renew-hookएक सफल नवीनीकरण के बाद केवल पुनरारंभ करने के लिए उपयोग करने के बारे में जानकारी के लिए यह पोस्ट देखें : guyrutenberg.com/2017/01/01/…
Whatcould

17

आपको कुछ भी सेट नहीं करना चाहिए। हाल ही के किसी भी डेबियन / उबंटू सर्टिफिकेट की स्थापित प्रणाली को एक सिस्टेम टाइमर और क्रोन जॉब स्थापित करना चाहिए (और क्रोन जॉब केवल तभी चलेगी certbotजब सिस्टेम सक्रिय नहीं है, इसलिए आपको रनिंग दोनों नहीं मिलती है)।

सिस्टम टाइमर

आप कमांड का उपयोग करके अपने सिस्टम टाइमर को देख सकते हैं 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

सर्टिफिकेट टाइमर यहां होना चाहिए /lib/systemd/system/certbot.timerऔर यह निर्दिष्ट कमांड को निष्पादित करेगा/lib/systemd/system/certbot.service

certbot.timer 12 घंटे (43200 सेकंड) के यादृच्छिक विलंब के बाद, 12 बजे और 12 बजे `सर्टिफ़िकेट.सर्विस निष्पादित करेगा।

# 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

क्रॉन नौकरी

जैसा कि दूसरों ने उल्लेख किया है, इसमें एक क्रॉन जॉब भी स्थापित है /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झंडा "शांत" है - किसी भी उत्पादन का उत्पादन नहीं करते जब तक कि वहाँ एक त्रुटि है।

मैं मूल रूप से क्रॉन की नौकरी से उलझन में था क्योंकि यह सिस्टमड की वजह से चलने वाला नहीं था, इसलिए सर्बोट कैसे चलाया जाएगा? मुझे इस फोरम पोस्ट में उत्तर मिला जो कि मैंने इस उत्तर पर आधारित है।


1
"आपको कुछ भी सेट नहीं करना चाहिए" लेकिन मेरा प्रमाणपत्र हाल ही में समाप्त हो गया है, और मैंने लगभग 3 महीने पहले सर्टिफिकेट स्थापित किया है। /etc/cron.d/certbotमौजूद है, systemctl list-timersदिखाता है certbot.timer, लेकिन मेरे अनाज को नवीनीकृत नहीं किया गया था। चल रहा है certbotमैन्युअल रूप से ठीक काम किया है, इसलिए मैं नहीं जानता कि क्या हो रहा है। एक पुराने स्कूल में crontabप्रवेश को समाप्त किया ।
Dan Dascalescu

यह तिथि और सही उत्तर के लिए सबसे अधिक है, लेकिन एक चेतावनी के साथ कि यह इस बात पर निर्भर करता है कि आप कितने दूर
olive_tree

"और क्रॉन जॉब तभी चलेगा जब सिस्टमड सक्रिय नहीं होगा"। क्या आप इस "पूर्वता" के बारे में कुछ डॉक्टर को खोजने में मदद कर सकते हैं?
टाइटस

@titus व्याख्या यह है कि क्रॉन जॉब पहले testयह जांचने के लिए चलता है कि क्या सिस्टम सक्रिय है और यदि यह है, तो क्रॉन जॉब तुरंत बिना रुके निकल जाती है certbot- क्रॉन जॉब के बारे में टेक्स्ट देखें। मैं पाठ को अधिक सटीक होने के लिए संपादित करूंगा।
हामिश डाउनर

5

LetsEncrypt सर्टिफिकेट रिन्यूअल के लिए, मैं आम तौर पर getsl का उपयोग करता हूं । यह एक बहुत ही आसान खोल आवरण है जो SSH कनेक्शन के माध्यम से अन्य मशीनों पर भी प्रमाण पत्र स्थापित कर सकता है।

क्रोन प्रविष्टि निम्नलिखित है:

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

जैसा कि पहले से ही सुझाव दिया गया है, आपको इसे दिन में दो बार रोजाना या उससे भी बेहतर चलाना चाहिए।


3

जैसा कि पहले से ही glaux द्वारा उल्लिखित है:

ध्यान दें: यदि आप एक क्रोन या सिस्टमड जॉब सेट कर रहे हैं, तो हम इसे प्रति दिन दो बार चलाने की सलाह देते हैं (यह तब तक कुछ भी नहीं करेगा जब तक कि आपके प्रमाण पत्र नवीनीकरण या निरस्त नहीं हो जाते, लेकिन इसे नियमित रूप से चलाने से आपकी साइट को रहने का मौका मिलेगा। ऑनलाइन मामले में आइए किसी कारण से एनक्रिप्टेड-शुरू किए गए निरसन हुआ)। कृपया अपने नवीनीकरण कार्यों के लिए घंटे के भीतर एक यादृच्छिक मिनट का चयन करें।

स्रोत: 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"

-पर-हुक और -पोस्ट-हुक हुक हर नवीनीकरण के प्रयास से पहले और बाद में चलते हैं। यदि आप चाहते हैं कि आपका हुक एक सफल नवीनीकरण के बाद ही चले, तो इस तरह से कमांड में --renew- हुक का उपयोग करें।

स्रोत: https://certbot.eff.org/docs/use.html


1
"कृपया अपने नवीनीकरण कार्यों के लिए घंटे के भीतर एक यादृच्छिक मिनट का चयन करें।"
Isius

1
मेरे ऊपर दिए गए नोट के अनुसार, आप बेहतर तरीके से बंद होंगे --renew-hook, जो आपके सर्वर को केवल तब ही पुनरारंभ करता है जब प्रमाणपत्र वास्तव में नवीनीकृत होता है।
व्हाकल्ड

@Isius धन्यवाद, मैंने इसे एक यादृच्छिक मिनट (6) में बदल दिया।
तद्ज

1
@JedatKinports: नहीं करना चाहिए --post-hookऔर --renew-hookहो service apache2 restartके बजाय service restart apache2?
पॉल रताज़ी

1
कमांड अपाचे 2 पुनरारंभ सेवा है ! यह 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

इसलिए प्रमाणपत्र को दैनिक नवीनीकृत करने में कोई समस्या नहीं है, मेरा क्रोन तब है:

@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

अन्य सदस्यों ने पहले से ही बहुत अधिक विस्तृत उत्तर दिए हैं। लेकिन ऐसा लगता है कि मुझे यहां इसका उल्लेख करना चाहिए।

सर्पोट संस्करण के रूप में 0.21.1 --renew-hookध्वज को बदल दिया जाता है --deploy-hook यह सुनिश्चित करने के लिए कि आप हटाए गए ध्वज का उपयोग नहीं कर रहे हैं।

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

0

ईएफएफ सर्टिफिकेट गाइड के अनुसार

कई लिनक्स वितरण स्वचालित नवीनीकरण प्रदान करते हैं जब आप उनके सिस्टम पैकेज प्रबंधक के माध्यम से स्थापित संकुल का उपयोग करते हैं।

क्या आप वाकई या नहीं, आपके सिस्टम यह पहले से ही स्वचालित है नहीं हैं, तो अपने सिस्टम की जाँच crontab (आमतौर पर में /etc/crontab/और /etc/cron.*/* $ crontab -lऔर systemd टाइमर $ systemctl list-timers

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.