ACME client component for 4D

J’ai un serveur web que je tente de passer en https, d’abord de façon simple avec des certificats de letsencrypt.org.
J’ai découvert ce lien https://kb.4d.com/assetid=77671 qui est bien intéressant.

Mais j’obtiens toujours l’erreur 403, je pense que c’est dû à ma licence de développeur : depuis la v16, il semble que le serveur web n’accepte que les connexion localhost, comme si on allait héberger un serveur web avec un dev :frowning:
Bref, ça bloque beaucoup pour développer.

Mais au delà de cela, des personnes ont-elles déjà utilisé ce composant ?
Comment savoir qu’une clef est devenue périmée et qu’il faut la renouveler ?
Ou alors on considère systématiquement que c’est valable x mois ? C’est pas précis…

Merci !

Bonjour,

: Olivier GRIMBERT

d’abord de façon simple avec des certificats de letsencrypt.org.

Pour ceux qui ne connaissent pas letsencrypt est une organisation qui a été créée pour démocratiser la sécurité et l’utilisation de certificats.
Elle fournit des certificat DV gratuitement (en automatisant complètement le process).
Ces certificats ont une durée de 3 mois mais l’organisation propose des outils pour les renouveler automatiquement. Donc une fois leur outil installé c’est magique les certificats se renouvellent tout seuls :mrgreen:.
Ils ont publié un protocole (nommé ACME) qui permet de renouveler les certificats.
Il y a une implémentation officielle d’un client (https://certbot.eff.orgcertbot>) et https://letsencrypt.org/docs/client-options/plusieurs implémentations de “clients” pour de nombreux environnements>.
Je pense qu’il sont les seuls à utiliser ce protocole côté serveur (mais c’est ouvert).

https://letsencrypt.org

Selon moi, le but de letsencrypt n’est pas de faire “simple” mais de faire gratuit et automatique.

Si tu cherches une solution vraiment simple je préconiserai un certificat autosigné. Ca permet de tester un site en https sans avoir a acheter un certificat ou utiliser letsencrypt (ni que ton serveur soit public).
Avec un certificat autosigné, le navigateur grogne un peu (car l’AC n 'est pas dans la liste des AC de confiance et reconnues), mais tu peux transiger sur la sécurité pour une phase de test interne par exemple.

Sinon, j’ai travaillé sur le protocole ACME v2 de letsencrypt. C’est un PoC (sous la forme d’un composant) qui reste à finaliser…
C’est opérationnel, il faut que je travaille sur une interface…

Le protocole permet de vérifier la réelle possession/maitrise du nom de domaine (et du controle du serveur web et du DNS) par 3 méthode :

  • http (il faut que le serveur web soit joignable sur le port 80 depuis l’extérieur, letsencrypt fera une requête bien spécifique pour vérification : le “challenge”). C’est avec ce type de challenge qu’on peut automatiser le renouvellement de certificats.
  • tls-sni (désactivé pour raison de sécurité)
  • dns (c’est donc un peu manuel).

Enfin, a moins de vouloir des certificats OV ou EV (et avoir un joli cadenas “vert”), letsencrypt fait très bien le job et gratuitement.

Conclusion : en test on utilise des certificats autosigné. En prod des certificats letsencrypt (et bye bye de soucis et frais de renouvellement de certificats).

Merci Bruno.

Certes, mais finalement c’est simple aussi avec letsencrypt car… il y a le composant qui est censé faire tout.
Quand tu parles d’avoir travaillé sur le protocole, tu veux dire que tu en as fait un composant, voire que celui dont je parle est le tien ?

Bonjour,

: Olivier GRIMBERT

Certes, mais finalement c’est simple aussi avec letsencrypt car… il
y a le composant qui est censé faire tout.
Il faut que ton serveur http soit public (ouvert sur le port 80) pour utiliser le challenge http. En prod, c’est généralement normal. En phase de test, ça peut être une contrainte.

: Olivier GRIMBERT

Quand tu parles d’avoir travaillé sur le protocole, tu veux dire que
tu en as fait un composant, voire que celui dont je parle est le tien ?

Le composant de la kb a été écrit par Tim Penner, il implemente ACME v1 il me semble.

J’ai implémenté le protocole ACME v2 (en partie par curiosité pour comprendre comment marchait le protocole).

Oh oh !
Tu aurais un zip à fournir ?

Et quelle est la différence entre v1 et v2 ?

D’autre part, pour automatiser la (re) demande de clef, je me demande, quand on fait une requête, comment savoir la date de fin de validité ? Ainsi, je pourrait la re-valider dans un pseudo batch cron en 4d :slight_smile:

Bonjour,

: Olivier GRIMBERT

Oh oh !
Tu aurais un zip à fournir ?
Pas encore (c’est pas finalisé)

: Olivier GRIMBERT

Et quelle est la différence entre v1 et v2 ?
https://tools.ietf.org/rfcdiff?url1=https://tools.ietf.org/id/draft-ietf-acme-acme-01.txt&url2=https://tools.ietf.org/id/draft-ietf-acme-acme-07.txt :slight_smile:

: Olivier GRIMBERT

D’autre part, pour automatiser la (re) demande de clef, je me
demande, quand on fait une requête, comment savoir la date de fin de
validité ? Ainsi, je pourrait la re-valider dans un pseudo batch cron
en 4d
Avec openssl on peut lire le contenu d’un certificat.
On peut récupérer une chaine du type “notAfter=Dec 17 17:21:18 2019 GMT” qu’il faut parser…
C’est déjà dans le composant. Avec un outil pour générer des certificats autosignés aussi.
Enfin, j’ai testé la génération de certificats avec des “alt names”.
Le composant embarque les executables openssl (appelé avec LPE) pour faire tout ça…

Voici un exemple de code pour créer un certificat autosigné et ensuite lire la date de fin de validité du certificat :
<code 4D>
C_OBJET($vo_csrObj)
OB FIXER($vo_csrObj;“CN”;“www.ac-consulting.fr”)

C_OBJET($vo_csrReqConfObject)
$vo_csrReqConfObject:=acme_csrReqConfObjectNew ($vo_csrObj)

C_TEXTE($vt_key;$vt_cert)
acme_rsaCertSelfSignedCreate (->$vt_key;->$vt_cert;$vo_csrReqConfObject)

C_TEXTE($vt_certDate)
$vt_certDate:=acme_certToText (->$vt_cert;“enddate”)
// “notAfter=Dec 17 17:27:50 2019 GMT\n”

C_TEXTE($vt_timestamp)
$vt_timestamp:=acme_dateParse ($vt_certDate)
// “20191217T172750Z”

ALERTE($vt_certDate+"\r"+$vt_timestamp)

</code 4D>

Bonjour,

Tu es sur Mac ou Windows ?

Le composant a été testé sur OS X et 4D v15.
Il faudra que je valide sur Windows…

Envoie moi un mail sur b.legay [at] ac-consulting.fr si tu es intéressé…

Exemple de code pour décider si le certificat doit être renouvelé :
<code 4D>
C_BOOLÉEN($vb_renew)

$vb_renew:=Faux

// Load current certificates (and private key)
C_TEXTE($vt_key;$vt_cert)
Si (acme_certCurrentGet (->$vt_key;->$vt_cert))

C_ENTIER LONG($vl_nbDays;$vl_secs)
$vl_nbDays:=30
$vl_secs:=$vl_nbDays*86400 // 86400 = 24 x 60 x 60

// check if the certificate will expire
$vb_renew:=acme_certCheckEnd ($vt_cert;$vl_secs)
Si ($vb_renew) // do some logs here…

Fin de si

Sinon // no certificates
$vb_renew:=Vrai
Fin de si

Si ($vb_renew)
cert_renewSimple
Fin de si

</code 4D>

Exemple de code pour renouveler un certificat (fonction “cert_renewSimple”) :
<code 4D>
// cert_renewSimple
C_BOOLÉEN($0;$vb_ok)

C_TEXTE($vt_domain)
$vt_domain:=“www.example.com

C_OBJET($vo_newOrderObject)
$vo_newOrderObject:=acme_newOrderObject (->$vt_domain)

C_OBJET($vo_dn)
OB FIXER($vo_dn;“C”;“FR”)
OB FIXER($vo_dn;“L”;“Paris”)
OB FIXER($vo_dn;“ST”;“Paris (75)”)
OB FIXER($vo_dn;“O”;“AC Consulting”)
OB FIXER($vo_dn;“OU”;“AC Consulting”)
OB FIXER($vo_dn;“emailAddress”;"john@example.com")
OB FIXER($vo_dn;“CN”;$vt_domain)

C_OBJET($vo_csrReqConfObject)
$vo_csrReqConfObject:=acme_csrReqConfObjectNew ($vo_dn)

$vb_ok:=acme_newOrderAndInstall ($vo_newOrderObject;$vo_csrReqConfObject)

</code 4D>