Η Let's Encrypt εκδίδει πιστοποιητικά για ενενήντα μέρες και τα ανανεώνει αυτόματα, γι' αυτό ο κόσμος παύει να τα σκέφτεται μία εβδομάδα μετά τη ρύθμιση. Το πρόβλημα είναι ότι η αυτόματη ανανέωση χαλάει αθόρυβα: κανείς δεν βλέπει τα σφάλματα και τρεις μήνες αργότερα ο ιστότοπος υποδέχεται τους επισκέπτες με προειδοποίηση του περιηγητή. Από το 2025 η Let's Encrypt έπαψε να στέλνει μηνύματα ειδοποίησης λήξης, οπότε χάθηκε και η τελευταία εξωτερική υπενθύμιση.

Παρακάτω είναι οι λόγοι που η ανανέωση σταματά να δουλεύει, κατά φθίνουσα συχνότητα.

1. Το πιστοποιητικό ανανεώθηκε και η υπηρεσία δεν το ξαναδιάβασε ποτέ

Ο συνηθέστερος. Το certbot renew έτρεξε, το νέο αρχείο είναι στον δίσκο και ο nginx ή ο Apache κρατούν το παλιό στη μνήμη — σερβίροντάς το στους επισκέπτες μέχρι να επαναφορτωθεί η ρύθμιση. Τυπικά όλα καλά· στην πραγματικότητα ο ιστότοπος έχει ληγμένο πιστοποιητικό.

Η θεραπεία είναι ένα άγκιστρο που τρέχει μετά από επιτυχημένη ανανέωση:

sudo certbot renew --deploy-hook "systemctl reload nginx"

Αυτό γράφεται μία φορά στο αρχείο ανανέωσης (/etc/letsencrypt/renewal/example.com.conf, ενότητα [renewalparams], γραμμή renew_hook) και από εκεί και πέρα δουλεύει μόνο του.

2. Ο διακομιστής ιστού άλλαξε και η πρόκληση όχι

Η πρόκληση HTTP-01 απαιτεί ένα αρχείο από το /.well-known/acme-challenge/ να σερβίρεται μέσω απλού HTTP. Συνήθως χαλάει έτσι:

  • προστέθηκε στη ρύθμιση ανεπιφύλακτη ανακατεύθυνση από HTTP σε HTTPS — η πρόκληση ακολουθεί την ανακατεύθυνση και αποτυγχάνει·
  • εμφανίστηκε κανόνας location ~ /\. με deny all, κλείνοντας κάθε κατάλογο με τελεία, μαζί και το .well-known·
  • η ρίζα του ιστότοπου μετακινήθηκε ενώ οι ρυθμίσεις του certbot κράτησαν το παλιό --webroot-path·
  • ενεργοποιήθηκε αποκλεισμός ανά χώρα ή βασική πιστοποίηση και έπιασε τον διακομιστή επικύρωσης μαζί με όλους τους άλλους.

Η σωστή σειρά στη ρύθμιση: πρώτα ειδικό location για το /.well-known/acme-challenge/ και μόνο μετά η γενική ανακατεύθυνση.

3. Ο χρονομετρητής είναι κλειστός

Η ανανέωση τρέχει από χρονομετρητή systemd ή από εργασία cron, και οποιοδήποτε από τα δύο μπορεί να απενεργοποιηθεί κατά λάθος στην αποσφαλμάτωση ή να χαθεί στη μετακίνηση του διακομιστή.

systemctl list-timers | grep certbot
sudo certbot renew --dry-run

Η δεύτερη εντολή εκτελεί πλήρη κύκλο ανανέωσης σε δοκιμαστική λειτουργία χωρίς να ξοδεύει το όριό σας. Είναι ο μόνος έλεγχος που απαντά εκ των προτέρων στο «θα ανανεωθεί αυτό σε έναν μήνα;» αντί εκ των υστέρων.

4. Ένας τομέας δεν δείχνει πια εδώ

Το πιστοποιητικό καλύπτει πέντε τομείς, ένας τους μετακόμισε σε άλλον υπολογιστή υποδοχής, το DNS άλλαξε. Η επικύρωση γι' αυτόν τον τομέα παύει να περνά και το certbot δεν ανανεώνει ολόκληρο το πιστοποιητικό — μαζί και τους τέσσερις που δουλεύουν. Οι περιττοί τομείς πρέπει να αφαιρεθούν από το πιστοποιητικό, όχι να αγνοηθούν μαζί με το μήνυμα.

5. Χτυπήσατε τα όρια ρυθμού

Η Let's Encrypt περιορίζει τον αριθμό πιστοποιητικών ανά τομέα την εβδομάδα. Αυτό συνήθως προκύπτει από τον βρόχο «δεν δούλεψε, ας ξαναδοκιμάσω» κατά την αποσφαλμάτωση. Υπάρχει διακομιστής δοκιμών για πειράματα (--dry-run ή --test-cert) και πρέπει να χρησιμοποιείται πριν εξαντληθεί το όριο και όχι μετά.

Ελέγξτε τι σερβίρεται, όχι τι αποθηκεύεται

Κάθε έλεγχος βασισμένος σε αρχεία στον δίσκο έχει ένα ελάττωμα: το αρχείο μπορεί να είναι φρέσκο ενώ ο επισκέπτης λαμβάνει το παλιό πιστοποιητικό. Κοιτάξτε από την πλευρά του πελάτη:

echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
  | openssl x509 -noout -dates -subject -issuer

Η επιλογή -servername είναι υποχρεωτική: χωρίς αυτήν, σε διακομιστή με αρκετούς ιστότοπους παίρνετε το πιστοποιητικό όποιου εικονικού κόμβου έρχεται πρώτος και όχι εκείνου που εννοούσατε. Στην έξοδο, το notAfter είναι η πραγματική ημερομηνία λήξης.

Και μιας και βρίσκεστε εκεί, ελέγξτε την αλυσίδα:

echo | openssl s_client -connect example.com:443 -servername example.com -showcerts 2>/dev/null | grep -c 'BEGIN CERTIFICATE'

Αν υπάρχει μόνο ένα πιστοποιητικό, το ενδιάμεσο δεν σερβίρεται. Οι περιηγητές συνήθως συγχωρούν αυτή τη διάταξη — χτίζουν μόνοι τους την αλυσίδα — αλλά το curl, οι εφαρμογές κινητών και οι πελάτες Java θα αποτύχουν στην επικύρωση. Αυτό είναι το κλασικό «σε μένα ανοίγει μια χαρά και στον πελάτη δεν δουλεύει».

Πόσες μέρες προειδοποίηση

Οι τριάντα μέρες είναι λογική πρώτη ειδοποίηση: τόσες απομένουν και όταν το certbot αρχίζει να επιχειρεί ανανέωση, οπότε αν ως τότε δεν έχει γίνει τίποτα, ο μηχανισμός είναι χαλασμένος. Οι δεκατέσσερις μέρες είναι η δεύτερη ειδοποίηση, που ήδη απαιτεί ενέργεια σήμερα. Οι επτά είναι έκτακτη ανάγκη.

Σημασία έχει να παρακολουθείτε όλα τα πιστοποιητικά ταυτόχρονα, μαζί κι εκείνα που δεν ήρθαν από τη Let's Encrypt: όσα αγοράστηκαν για έναν χρόνο ξεχνιούνται πιο σίγουρα απ' όλα, επειδή μέσα σε έναν χρόνο όλοι έχουν ξεχάσει και αυτά και σε ποιανού το γραμματοκιβώτιο πάνε οι ειδοποιήσεις. Μία σελίδα με τους τομείς, τις ημερομηνίες και τις μέρες που απομένουν κλείνει το ζήτημα εντελώς — όπως στην επίδειξη παρακάτω.