Certificat Lets Encrypt : erreur création ou renouvellement

Mon serveur YunoHost

Matériel: VPS OVH
Version de YunoHost: 3.6.5.2
J’ai accès à mon serveur : En SSH ( webadmin HS … )
Êtes-vous dans un contexte particulier ou avez-vous effectué des modificiations particulières sur votre instance ? : non

Description du problème

Bonjour à tous :slight_smile:

Mon instance tourne sans problème depuis +6 mois. Et alors que les précédents renouvellements de certificat Lets Encrypt s’étaient bien passés, aujourd’hui, ils plantent.

Pour résoudre le problème, j’ai installé un certificat auto-signé puis j’ai demandé l’installation d’un nouveau certificat Lets Encrypt. Pas mieux …

L’erreur renvoyée :

2019-10-15 09:38:44,069: INFO - Parsing account key...
2019-10-15 09:38:44,098: INFO - Parsing CSR...
2019-10-15 09:38:44,123: INFO - Found domains: sirtoad.fr
2019-10-15 09:38:44,124: INFO - Getting directory...
2019-10-15 09:38:58,411: ERROR - Error getting directory:
Url: https://acme-v02.api.letsencrypt.org/directory
Data: None
Response Code: None
Response: <urlopen error [Errno -3] Temporary failure in name resolution>
2019-10-15 09:38:58,539: WARNING - Debug information:
 - domain ip from DNS        51.68.47.3
 - domain ip from local DNS  127.0.0.1
 - public ip of the server   51.68.47.3

2019-10-15 09:38:58,659: WARNING - Debug information:
 - domain ip from DNS        51.68.47.3
 - domain ip from local DNS  127.0.0.1
 - public ip of the server   51.68.47.3

2019-10-15 09:38:58,660: ERROR - Certificate installation for sirtoad.fr failed !
Exception: Signing the new certificate failed

J’ai la même erreur pour le renouvellement d’un autre certificat sur le même VPS.

J’ai essayé dig et host sur acme-v02.api.letsencrypt.org qui semble être à l’origine du problème :

# dig acme-v02.api.letsencrypt.org                                
; <<>> DiG 9.10.3-P4-Debian <<>> acme-v02.api.letsencrypt.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 43432
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;acme-v02.api.letsencrypt.org.  IN      A

;; ANSWER SECTION:
acme-v02.api.letsencrypt.org. 1640 IN   CNAME   prod.api.letsencrypt.org.
prod.api.letsencrypt.org. 169   IN      CNAME   ca80a1adb12a4fbdac5ffcbc944e9a61.pacloudflare.com.
ca80a1adb12a4fbdac5ffcbc944e9a61.pacloudflare.com. 169 IN A 172.65.32.248

;; Query time: 5 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Oct 15 11:37:02 CEST 2019
;; MSG SIZE  rcvd: 155


# host acme-v02.api.letsencrypt.org
acme-v02.api.letsencrypt.org is an alias for prod.api.letsencrypt.org.
prod.api.letsencrypt.org is an alias for ca80a1adb12a4fbdac5ffcbc944e9a61.pacloudflare.com.
ca80a1adb12a4fbdac5ffcbc944e9a61.pacloudflare.com has address 172.65.32.248
ca80a1adb12a4fbdac5ffcbc944e9a61.pacloudflare.com has IPv6 address 2606:4700:60:0:f53d:5624:85c7:3a2c

Mais tout me semble OK de ce coté.

Mes recherches G**gle n’ont rien donné. Je sèche …

Une idée ?.. Merci d’avance :slight_smile:

Greg

Et si tu ping le domaine ?

Et bien il répond geniment …

$ ping acme-v02.api.letsencrypt.org
PING ca80a1adb12a4fbdac5ffcbc944e9a61.pacloudflare.com (172.65.32.248) 56(84) bytes of data.
64 bytes from 172.65.32.248 (172.65.32.248): icmp_seq=1 ttl=54 time=4.89 ms
64 bytes from 172.65.32.248 (172.65.32.248): icmp_seq=2 ttl=54 time=4.93 ms
64 bytes from 172.65.32.248 (172.65.32.248): icmp_seq=3 ttl=54 time=4.96 ms
64 bytes from 172.65.32.248 (172.65.32.248): icmp_seq=4 ttl=54 time=4.97 ms
^C
--- ca80a1adb12a4fbdac5ffcbc944e9a61.pacloudflare.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms

Je viens de refaire un test de renouvellement / création et j’ai toujours la même erreur :frowning:

As-tu tenté de redémarrer le serveur ?

Peux-tu également après ce redémarrage (si ça ne fonctionne toujours pas) faire un :

sudo service --status-all

(Permets de vérifier les services actifs).

EDIT : Peux-tu également tenter cette commande ?

curl https://acme-v02.api.letsencrypt.org/directory

Ah non, je n’avais pas tenté de rebooter le serveur … Merci pour la piste :+1:

La commande sudo service --status-all, avant ou après le reboot, donne le même résultat :

# sudo service --status-all
 [ + ]  avahi-daemon
 [ + ]  cloud-config
 [ + ]  cloud-final
 [ + ]  cloud-init
 [ + ]  cloud-init-local
 [ - ]  console-setup.sh
 [ + ]  cron
 [ + ]  dbus
 [ + ]  dnsmasq
 [ + ]  dovecot
 [ + ]  fail2ban
 [ + ]  fake-hwclock
 [ + ]  glances
 [ + ]  haveged
 [ - ]  hwclock.sh
 [ - ]  keyboard-setup.sh
 [ + ]  kmod
 [ + ]  metronome
 [ + ]  mysql
 [ + ]  networking
 [ + ]  nginx
 [ + ]  nslcd
 [ + ]  openvpn
 [ + ]  php7.0-fpm
 [ + ]  pihole-FTL
 [ + ]  postfix
 [ + ]  postsrsd
 [ + ]  procps
 [ + ]  redis-server
 [ + ]  resolvconf
 [ + ]  rspamd
 [ - ]  rsync
 [ + ]  rsyslog
 [ + ]  slapd
 [ + ]  sogo
 [ + ]  squid
 [ + ]  ssh
 [ + ]  stunnel4
 [ - ]  sudo
 [ - ]  sudo-ldap
 [ + ]  udev
 [ - ]  unbound
 [ + ]  unscd
 [ + ]  yunohost-api
 [ + ]  yunohost-firewall

Par contre, je ne sais pas si un service important est HS …

De même, la commande curl https://acme-v02.api.letsencrypt.org/directory fonctionne, avant ou après le reboot (il n’y a que le “4wHyyrCHrT8” qui change d’une fois sur l’autre, mais je pense que c’est normal …)

# curl https://acme-v02.api.letsencrypt.org/directory
{
  "4wHyyrCHrT8": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417",
  "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change",
  "meta": {
    "caaIdentities": [
      "letsencrypt.org"
    ],
    "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf",
    "website": "https://letsencrypt.org"
  },
  "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct",
  "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce",
  "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order",
  "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert"
}

Mais le renouvellement ou la création d’un certificat Let’s Encrypt renvoie toujours la même erreur. Même après le reboot :frowning:

Pour ceux qui savent la lire, la log complète du renouvellement est consultable ici : https://paste.yunohost.org/raw/osaqeputov

Merci d’avance

Là… c’est vrai que je ne comprends pas. Tu peux faire un cat /etc/resolv.conf ?

Bien sur :slight_smile:

$  cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.0.1
search openstacklocal

Pour info, j’avais essayé en mettant 1.1.1.1 (DNS cloudflare) ou 8.8.8.8 (DNS google). Mais le résultat était le même.

Pi-Hole est installé mais n’avait jamais posé problème jusqu’à présent. Et je ne pense pas qu’il gêne vu que les commandes seules fonctionnent (dig, host, ping, curl, …)

Hello,

Est-ce que le test d’ouverture de port yunohost montre que le 80 est bien OK ?
https://ports.yunohost.org
Je viens de tester sur ton IP 51.68.47.3, c’est OK
Et test sur openstacklocal.fr OK en 80 et 443
martoni

Bonjour,
Et le 443 ?
Je crois que Let’s Encrypt l’utilise !

Hello,
Une suppression du domaine dans yunohost et recréation de zéro avec le certificat fonctionne peut être ?

martoni

Et que donne :

curl -6 https://acme-v02.api.letsencrypt.org/directory

Si cette ligne renvoie quelques chose c’est que ça semble pas lié à l’ipv6

Je remarque que les serveurs DNS d’aquilenet et de Grifon ne répondent pas. Peut être une piste ?

Sinon, le problème arrive dans ce bout de code:

Tu peux essayer de le lancer manuellement comme ceci, ça nous permettra d’en savoir plus.

python <<EOF
from urllib2 import urlopen, Request
import json
depth = 0
try:
    resp = urlopen(Request("https://acme-v02.api.letsencrypt.org/directory", data=None, headers={"Content-Type": "application/jose+json", "User-Agent": "acme-tiny"}))
    resp_data, code, headers = resp.read().decode("utf8"), resp.getcode(), resp.headers
except IOError as e:
    resp_data = e.read().decode("utf8") if hasattr(e, "read") else str(e)
    code, headers = getattr(e, "code", None), {}
try:
    resp_data = json.loads(resp_data) # try to parse json results
except ValueError:
    pass # ignore json parsing errors
if depth < 100 and code == 400 and resp_data['type'] == "urn:ietf:params:acme:error:badNonce":
    raise IndexError(resp_data) # allow 100 retrys for bad nonces
if code not in [200, 201, 204]:
    raise ValueError("{0}:\nUrl: {1}\nData: {2}\nResponse Code: {3}\nResponse: {4}".format(err_msg, url, data, code, resp_data))
print(resp_data)
print(code)
print(headers)
EOF

Oui, les ports 80 et 443 sont bien montés.

Peut-être, oui. Mais je préfère utiliser ça en dernier recours …

Et bien ça ne marche pas …

# curl -6 https://acme-v02.api.letsencrypt.org/directory
curl: (7) Couldn't connect to server

# curl https://acme-v02.api.letsencrypt.org/directory
{
  "CZ6CYJEEsNg": "https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417",
  "keyChange": "https://acme-v02.api.letsencrypt.org/acme/key-change",
  "meta": {
    "caaIdentities": [
      "letsencrypt.org"
    ],
    "termsOfService": "https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf",
    "website": "https://letsencrypt.org"
  },
  "newAccount": "https://acme-v02.api.letsencrypt.org/acme/new-acct",
  "newNonce": "https://acme-v02.api.letsencrypt.org/acme/new-nonce",
  "newOrder": "https://acme-v02.api.letsencrypt.org/acme/new-order",
  "revokeCert": "https://acme-v02.api.letsencrypt.org/acme/revoke-cert"
}

Significatif ?..

Et bien, ça a l’air de fonctionner :

{u'newAccount': u'https://acme-v02.api.letsencrypt.org/acme/new-acct', u'RseFt_PEjno': u'https://community.letsencrypt.org/t/adding-random-entries-to-the-directory/33417', u'keyChange': u'https://acme-v02.api.letsencrypt.org/acme/key-change', u'newNonce': u'https://acme-v02.api.letsencrypt.org/acme/new-nonce', u'meta': {u'website': u'https://letsencrypt.org', u'termsOfService': u'https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf', u'caaIdentities': [u'letsencrypt.org']}, u'newOrder': u'https://acme-v02.api.letsencrypt.org/acme/new-order', u'revokeCert': u'https://acme-v02.api.letsencrypt.org/acme/revoke-cert'}
200
Server: nginx
Date: Wed, 16 Oct 2019 12:51:40 GMT
Content-Type: application/json
Content-Length: 658
Connection: close
Cache-Control: public, max-age=0, no-cache
X-Frame-Options: DENY
Strict-Transport-Security: max-age=604800

Si j’ai bien compris le code (suis pas un pro de Python), l’accés à l’url renvoie le code HTTP 200. Donc ça semble plutôt bon …

Je m’aperçois que la tentative de renouvellement donne des informations de traceback. Je me dis qu’elles peuvent être utiles …

# yunohost domain cert-renew www.sirtoad.fr
Info: Now attempting renewing of certificate for domain www.sirtoad.fr !
Info: The configuration file '/etc/dnsmasq.d/03-pihole-wildcard.conf' is expected to be deleted by regen-conf (category dnsmasq) but has been kept back.
Info: The configuration file '/etc/dnsmasq.d/01-pihole.conf' is expected to be deleted by regen-conf (category dnsmasq) but has been kept back.
Info: Parsing account key...
Info: Parsing CSR...
Info: Found domains: www.sirtoad.fr
Info: Getting directory...
Error: Error getting directory:
Url: https://acme-v02.api.letsencrypt.org/directory
Data: None
Response Code: None
Response: <urlopen error [Errno -3] Temporary failure in name resolution>
Warning: Debug information:
 - domain ip from DNS        51.68.47.3
 - domain ip from local DNS  51.68.47.3
 - public ip of the server   51.68.47.3

Error: Certificate renewing for www.sirtoad.fr failed !
Info: The operation 'Renew 'www.sirtoad.fr' Let's encrypt certificate' has failed! To get help, please share the full log of this operation using the command 'yunohost log display 20191016-130450-letsencrypt_cert_renew-www.sirtoad.fr --share'
Error: Traceback (most recent call last):
  File "/usr/lib/moulinette/yunohost/certificate.py", line 384, in certificate_renew
    _fetch_and_enable_new_certificate(domain, staging, no_checks=no_checks)
  File "/usr/lib/moulinette/yunohost/certificate.py", line 577, in _fetch_and_enable_new_certificate
    raise YunohostError('certmanager_cert_signing_failed')
YunohostError: Signing the new certificate failed

Error: Signing the new certificate failed

J’ai essayé d’installer le certificat d’un nouveau domaine tout frais.

Et bien ça plante … Même erreur …

Error: Error getting directory:
Url: https://acme-v02.api.letsencrypt.org/directory
Data: None
Response Code: None
Response: <urlopen error [Errno -3] Temporary failure in name resolution>

J’ai retesté, par acquis de conscience, les autres domaines et j’ai toujours la même erreur. Je n’ai aucune idée d’où le problème pourrait venir alors que tout fonctionnait il y a 3 mois, aux derniers renouvellements automatiques …

Je suis le seul à avoir ce problème ?..

J’ai trouvé une astuce pour que cela fonctionne …

J’ai modifié le fichier /etc/hosts de mon serveur en ajoutant cette ligne :
172.65.32.248 acme-v02.api.letsencrypt.org

J’ai obtenu l’adresse IP 172.65.32.248 par la commande ping acme-v02.api.letsencrypt.org . Et j’ai été méga surpris mais ça marche !

Pourquoi ? Je ne sais pas.

D’où vient le problème ? Je ne sais pas

Est-ce que ça peut rester comme ça ? A mon avis, non. Mais au moins mon problème est débloqué …

Des idées, des avis ?..

J’ai pas eu l’idée tout seul :frowning: Je l’ai trouvé ici.

Une autre astuce trouvée ailleurs était de modifier le MTU : le descendre de 1500 à 1400 resolvait le problème. Mais j’ai pas réussi à le faire sur mon serveur. Contenu du fichier /etc/network/interfaces.d/50-cloud-init.cfg :

auto ens3
iface ens3 inet dhcp
        mtu 1400

This topic was automatically closed 15 days after the last reply. New replies are no longer allowed.