Problème renouvellement Let's Encrypt

Bonjour, j’ai suivi le how to du forum pour l’installation d’un certificat let’s encrypt il y a quelques temps: pas de soucis!

Pour le renouvellement, je suis de nouveau le how to, et là, le script se lance, mais: erreur!

Comment faire?
(j’ai bien remplacer les DOMAIN_NAME, et retirer le ‘.’ dans LEBIN comme suggéré dans le how to)

(mon certificat expire le 8 mars ^^")

Yope,

okay … tu n’as pas la commande mail d’installé, c’est bizarre :smile:. Tu as bien un serveur mail qui tourne, ou pas du tout ? (Je demande pour essayer de trouver un workaround pour gérer le cas proprement).

Sinon en attendant tu peux essayer de regarder les logs, normalement il y a un fichier de log que tu peux inspecter avec la commande cat /tmp/cron-cert-renewer.log

@Kapu06 que te donne la commande dpkg -l|grep bsd-mailx ? As-tu souvenir d’avoir désinstallé des paquets à la main ?

Pour la commande mail il faut installer le paquet mailutils qui effectivement n’est pas présent par défaut.

1 Like

Alors^^:
cat /tmp/cron-cert-renewer.log

me donne:
Updating letsencrypt and virtual environment dependencies......Command "/root/.local/share/letsencrypt/bin/python2.7 -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-jtKEQ5/cryptography/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-fWg4Ya-record/install-record.txt --single-version-externally-managed --compile --install-headers /root/.local/share/letsencrypt/include/site/python2.7/cryptography" failed with error code 1 in /tmp/pip-build-jtKEQ5/cryptography
et dpkg -l|grep bsd-mailx ne me renvoie rien =/ du coup je viens d’installer mailutils. Mais ça ne réglera pas mon problème, tout est dans le log de toute façon, non?

Edit: le mail envoyé contient:
` Here is the log of what happened
Consider also checking /var/log/letsencrypt/

Updating letsencrypt and virtual environment dependencies…Command “/root/.local/share/letsencrypt/bin/python2.7 -u -c “import setuptools, tokenize;file=’/tmp/pip-build-niK8OK/cryptography/setup.py’;exec(compile(getattr(tokenize, ‘open’, open)(file).read().replace(’\r\n’, ‘\n’), file, ‘exec’))” install --record /tmp/pip-hTm6Sy-record/install-record.txt --single-version-externally-managed --compile --install-headers /root/.local/share/letsencrypt/include/site/python2.7/cryptography” failed with error code 1 in /tmp/pip-build-niK8OK/cryptography`

Sinon, puis-je renouveler le certificat sans ce script?

Salut,

oui normalement tu dois pouvoir le renouveller manuellement en tapant quelque chose comme ca (en plusieurs étapes pour améliorer la lisibilité) :

# Domains (à remplacer par ton domaine)
DOMAINS="yourDomain.tld"
# The executable (suivant si tu as utilisé le tuto ou le package; il faut peut-etre enlever le « . » dans le chemin)
LEBIN="/root/.letsencrypt/letsencrypt-auto"
# The config file
LECFG="/etc/letsencrypt/conf.ini"
# Renewal directory, which contains renewal configs for all certificates.
LERENEWAL="/etc/letsencrypt/renewal"
# Call for renewal
$LEBIN certonly --renew-by-default --config "$LECFG" --domains "$DOMAINS"

Par contre ça a l’air d’être un problème dans les dépendances de Lets Encrypt plutôt que dans le script lui-même… donc ça m’étonnerait que ça résolve ton problème. Tu peux aussi tenter de réinstaller le client Let’s Encrypt :

cd /root/
# Delete the LE client, which should be the folder ".letsencrypt", or "letsencrypt"
rm -f .letsencrypt
# Reinstall LE client (implicitly in folder "letsencrypt" ... move it back to ".letsencrypt" if needed...)
git clone https://github.com/letsencrypt/letsencrypt
# Then calling --help should initiate dependencies retrieving etc...
cd letsencrypt/
./letsencrypt-auto --help
# And if it worked; now you can retry renewing certificates ?

Bon… mon certificat s’est épuisé et je n’ai pas réussi à résoudre le problème + je l’ai empiré =/
Alors avant de faire plus d’âneries, je vous pose mon soucis.

J’ai suivi les conseils de CaptainSqrt2, mais cela n’avait pas fonctionné (je ne me rappel plus de la réponse du terminal).

Alors pour ré-installer letsencrypt j’ai suivi le tutoriel cité en premier post.
Mais maintenant nginx n’est pas content =/
Il me renvoie:
nginx: [emerg] duplicate location "/.well-known/acme-challenge" in /etc/nginx/conf.d/NdD.tld.conf:9 nginx: configuration file /etc/nginx/nginx.conf test failed
Et comme j’ai lancé une mise à jour ensuite, je n’ai plus du tout accès à mon site ^^ J’ai accès au serveur via ssh =)

Et je ne sais pas comment débuger tout ça =/
Je me sens bête =/

Edit:
Dans mon /etc/yunohost/certs/monnomdedomaine.tld j’ai un cert.pem qui est différent de celui présent dans /etc/letsencrypt/live/monnomdedomaine.tld, celui dans le yunohost/certs semble contenir 2 certificats (il y a deux fois: Begin certificat et End) dont un correspondant à celui présent dans /letsencrypt/live.
Est-ce une bonne piste à explorer?

Salut,

pour réparer ton serveur web, visiblement nginx te dit que tu as deux fois une location “/.well-known/acme-challenge” (i.e. le truc utilisé par lets encrypt). Il faut que tu ailles voir dans le dossier /etc/nginx/conf.d/NdD.tld.d/ et trouver quels sont les deux blocs location /.well-known/acme-challenge/ et en supprimer un. Pour trouver où ils sont, tu peux t’aider de la commande :

grep -nr "acme-challenge" ./

(en étant dans le dossier /etc/nginx/conf.d/NdD.tld.d/). Tu peux ensuite éditer un fichier avec nano leNomDuFichier par exemple.

Ensuite tu peux taper nginx -t pour vérifier que la config a l’air ok, et relancer nginx avec service nginx restart.

Pour le certificat, normalement dans /etc/yunohost/certs/domaine.tld/, ce sont des liens symboliques qui pointent sur les trucs dans /etc/letsencrypt/live/domaine.tld/. Normalement le crt.pem utilisé par Yunohost est en fait le fullchain.pem (pour des raisons un peu techniques, meme pas sur de comprendre moi meme :stuck_out_tongue: ).

La commande:

me renvoie
./letsencrypt.conf:1:location '/.well-known/acme-challenge' {
ce qui fait qu’il n’y a qu’une localisation: je l’ai supprimé, puis j’ai redémarré mon nginx et…MIRACLE!!

Merci ^^

Question bonus, j’ai tenté du coup la commande:
/etc/cron.weekly/certificateRenewer qui me dit que le certificat n’a pas besoin d’être renouvelé, puis-je forcer le renouvellement pour tester si tout fonctionne? Ou bien me reposerais-je la question quand mon certificat expirera?

Tu as vérifié que le certificat utilisé actuellement est celui de letsencrypt du coup ?

Par contre si tu n’as vraiment plus de /.well-known/acme-challenge/, ca posera problème lors du renouvellement de ton certificat car (en gros) c’est ce qui permet au client lets encrypt (qui tourne chez toi donc) de prouver aux serveurs de letsencrypt (qui te donnent le cert) que tu as le controle du nom de domaine.

Si tu veux vraiment tester le renew du certificate, tu peux par exemple remplacer temporairement 30 par 300 pour le nombre de jours de validité du certificat dans certificateRenewer, ici : https://github.com/alexAubin/letsencrypt_ynh/blob/master/sources/certificateRenewer#L17

Afr, ce que le terminal me répond:

Needs to be renewed. Attempting to …
rm: cannot remove ‘/tmp/cron-cert-renewer.log’: No such file or directory
An error occured, an email was sent.

Et le mail me dit:

Checking for new version…
Requesting root privileges to run letsencrypt…
/root/.local/share/letsencrypt/bin/letsencrypt certonly --renew-by-default --config /etc/letsencrypt/conf.ini --domains NdD.tld
IMPORTANT NOTES:

  • Congratulations! Your certificate and chain have been saved at
    /etc/letsencrypt/live/NdD.tld/fullchain.pem. Your cert will
    expire on 2016-06-06. To obtain a new version of the certificate in
    the future, simply run Let’s Encrypt again.

Et lorsque je regarde le certificat (quand je vais sur mon site): c’est un nouveau certificat (celui que j’ai créé ce week-end), mais pas celui que j’aurai créé là tout de suite.

Du coup, j’ai vérifié dans le /tmp, et le fichier cron-cert-renewer.log est finalement créé, alors je retente la commande /etc/cron.weekly/certificateRenewer qui me dit qu’il y a une erreur, mais le mail envoyé reste le même (/var/log/letsencrypt/letsencrypt.log est inchangé)

Hm j’avais pas pensé a ca, mais en fait pour vérifier si il y a eu une erreur, le script verifie la validité du certificat actuel pour savoir si il y a eu ou non une erreur … comme tu as mis la validité limite a 300 jours (si tu as bien suivi ce que j’ai mis plus haut :smile:), ton nouveau certificat sera considéré comme non valide … mais en vrai si tu regarde le message du mail, il te dis bien “Congratulations”, donc ca a marché :stuck_out_tongue:. Bref mon astuce est juste un peu foireuse :P.

Pour le fait que le certificat dans ton navigateur n’est pas le nouveau, c’est parce que du coup le script n’a pas redémarrer les services. Tu peux le faire en tapant :

service nginx reload
service metronome reload
service postfix reload
service dovector reload

Niquel!

Merci beaucoup! =)

Salut à tous,

Je me permets de répondre à ce post même s’il est déjà résolu.
J’ai eu exactement le même problème que Kapu06 mais je n’ai pas trouvé mon
bonheur dans le post: j’ai corrigé le problème d’une manière différente.

Le tutoriel dont Kapu06 fait mention propose un script pour automatiser le renew
du certificat:
https://raw.githubusercontent.com/alexAubin/letsencrypt_ynh/131a7071faea0f1374faf04784024e7cab69703a/sources/certificateRenewer
Ce script doit être copié dans le répertoire: /etc/cron.weekly

Dans ce script, le programme ${LEBIN} est exécuté (le tutoriel y fait mention en
tant que “/root/letsencrypt/letsencrypt-auto”) avec le nom de domaine en option.
Ce nom de domaine est obtenu avec une commande grep dans le fichier
${LERENEWAL}, dans mon cas: “/etc/letsencrypt/renewal”.

Malheureuement, avec mon installation, la commande grep renvoie une chaine vide
à la place du nom de domaine. Du coup, j’ai l’erreur “Requested domain is not a
FQDN” (où on devrait voir apparaitre le nom de domaine).

En effet, le programme exécute la commande suivante:
/root/letsencrypt/letsencrypt-auto certonly
–renew-by-default
–config “/etc/letsencrypt/conf.ini”
–domains ""
Qui renvoie l’erreur en question.

Dans mon cas, le nom de domaine est identique au nom du certificat (il me semble
que c’est un cas particulier).
Donc, j’ai modifié la fonction “renewCertificate” dans le script pour utiliser
le nom du certificat dans le cas où la commande grep renvoie une chaine vide, la
fonction ressemle maintenant à ça:

function renewCertificate()
{
    local CERT_NAME=$1
    local LOG_FILE=$2

    rm ${LOG_FILE}
    touch ${LOG_FILE}

    local CERT_FILE="${LELIVE}/${CERT_NAME}/cert.pem"
    local CERT_CONF="${LERENEWAL}/${CERT_NAME}.conf"
    # Parse "domains = xxxx", we might need to remove the last character
    # if it's a comma
    local DOMAINS=$(grep -o --perl-regex "(?<=domains \= ).*" "${CERT_CONF}")
    if [ "${DOMAINS}" = "" ]
    then
        echo "Unable to define domain from file: ${CERT_CONF}" > ${LOG_FILE} 2>&1
        echo "Trying to use certificate name as domain: ${CERT_NAME}" >> ${LOG_FILE}
        DOMAINS=${CERT_NAME}
    fi

    local LAST_CHAR=$(echo ${DOMAINS} | awk '{print substr($0,length,1)}')
    if [ "${LAST_CHAR}" = "," ]
    then
        local DOMAINS=$(echo ${DOMAINS} |awk '{print substr($0, 1, length-1)}')
    fi

    # Recreate the webroot folder (expected to be in /tmp/)
    WEBROOT_PATH=$(cat $CERT_CONF    \
                 | grep webroot_path \
                 | tr ',' ' '        \
                 | awk '{print $3}')
    mkdir -p ${WEBROOT_PATH}

    ${LEBIN} certonly          \
        --renew-by-default     \
        --config "${LECFG}"    \
        --domains "${DOMAINS}" \
        >> ${LOG_FILE} 2>&1
}

J’ai essayé de renouveler le certificat avec cette nouvelle version et ça a
fonctionné. Maintenant, je suis sûr que mon cron weekly va renouveler comme
attendu.


Same message in english:


Hello everyone,

I feel like I had to add some informations even if the post has already been
closed.
I had the exact same problem as Kapu06 but the post did not help me to resolve
it: I used a different method.

The tutorial Kapu06 mentioned explains how to get a script to automatize the
renew of the certificate:
https://raw.githubusercontent.com/alexAubin/letsencrypt_ynh/131a7071faea0f1374faf04784024e7cab69703a/sources/certificateRenewer
This script must be located in directory: /etc/cron.weekly

In this script, program ${LEBIN} is executed (the tutorial refers to it as
"/root/letsencrypt/letsencrypt-auto") with the domain name as option. This
domain name must be obtained through grep command in file ${LERENEWAL},
"/etc/letsencrypt/renewal" in my case.

Unfortunately, with my installation, the grep command returned an empty string
instead of the domain name. Hence the error message “Requested domain is not a
FQDN” (the domain name should appear in this string).

Indeed, the program executes the following command:
/root/letsencrypt/letsencrypt-auto certonly
–renew-by-default
–config “/etc/letsencrypt/conf.ini”
–domains ""
Which returns the error message.

In my case, the domain name is identical to the certificate name (it seems to be
a particular case).
So, basically, I modified the “renewCertificate” function in the script to use
the certificate name as domain name in case grep command returns an empty
string, the function is now as follows:

function renewCertificate()
{
    local CERT_NAME=$1
    local LOG_FILE=$2

    rm ${LOG_FILE}
    touch ${LOG_FILE}

    local CERT_FILE="${LELIVE}/${CERT_NAME}/cert.pem"
    local CERT_CONF="${LERENEWAL}/${CERT_NAME}.conf"
    # Parse "domains = xxxx", we might need to remove the last character
    # if it's a comma
    local DOMAINS=$(grep -o --perl-regex "(?<=domains \= ).*" "${CERT_CONF}")
    if [ "${DOMAINS}" = "" ]
    then
        echo "Unable to define domain from file: ${CERT_CONF}" > ${LOG_FILE} 2>&1
        echo "Trying to use certificate name as domain: ${CERT_NAME}" >> ${LOG_FILE}
        DOMAINS=${CERT_NAME}
    fi

    local LAST_CHAR=$(echo ${DOMAINS} | awk '{print substr($0,length,1)}')
    if [ "${LAST_CHAR}" = "," ]
    then
        local DOMAINS=$(echo ${DOMAINS} |awk '{print substr($0, 1, length-1)}')
    fi

    # Recreate the webroot folder (expected to be in /tmp/)
    WEBROOT_PATH=$(cat $CERT_CONF    \
                 | grep webroot_path \
                 | tr ',' ' '        \
                 | awk '{print $3}')
    mkdir -p ${WEBROOT_PATH}

    ${LEBIN} certonly          \
        --renew-by-default     \
        --config "${LECFG}"    \
        --domains "${DOMAINS}" \
        >> ${LOG_FILE} 2>&1
}

I tried to renew the certificate using this new version and in worked. Now I am
sure that my weekly cron will renew them as expected.

alb

1 Like

Bonjour,
Impeccable, j’ai eu même problème avec le nom de domaine.
J’ai donc fait la modification, mais attention il manque la fin de ligne sur la ligne suivante:
J’ai ajouté “}”

Merci
Nino

Merci Nino pour ton retour.
J’ai édité le post pour rajouter le caractère manquant du coup.

alb

Merci pour cette contribution, j’avais le même problème (Requested domain is not a FQDN) et maintenant le renouvellement fonctionne.
Il pourrait être judicieux de proposer un commit pour intégrer cette modification ?

Bien trouvé, merci à toi ! :wink:

Question, pourquoi écraser le fichier de log au début ?

Salut,

Je ne l’ai vu qu’après avoir posté le message mais le problème a déjà été corrigé ; il suffit d’appliquer le patch comme indiqué par CaptainSqrt2 sur ce post.

C’est à dire cette correction.

Pour répondre à gnuraph, la suppression du log était présente dans le code lorsque je l’ai modifié, il semble qu’elle ait depuis été supprimée.

alb