Aller au contenu principal

3. Défi TLS avec ALPN

3. Défi TLS avec Application-Layer Protocol Negotiation (TLS ALPN)

La méthode de validation TLS avec Application-Layer Protocol Negotiation (TLS ALPN) prouve le contrôle d'un nom de domaine en exigeant que le client ACME configure un serveur TLS pour répondre à des tentatives de connexion particulières au moyen de l'extension ALPN et d'informations d'identification. Le serveur ACME valide le contrôle du nom de domaine en se connectant à un serveur TLS à l'une des adresses résolues pour le domaine et en vérifiant qu'un certificat contenant un contenu spécifique est présenté.

L'objet de défi ACME tls-alpn-01 a le format suivant:

type (obligatoire, chaîne): la chaîne tls-alpn-01.

token (obligatoire, chaîne): une valeur aléatoire qui identifie le défi de manière unique. Cette valeur DOIT contenir au moins 128 bits d'entropie. Elle NE DOIT contenir aucun caractère hors de l'alphabet base64url décrit à la section 5 de [RFC4648]. Les caractères de bourrage = finaux DOIVENT être supprimés. Voir [RFC4086] pour des informations supplémentaires sur les exigences d'aléa.

Le client se prépare à la validation en construisant un certificat auto-signé qui DOIT contenir une extension acmeIdentifier et une extension subjectAlternativeName [RFC5280]. L'extension subjectAlternativeName DOIT contenir une seule entrée dNSName, dont la valeur est le nom de domaine en cours de validation. L'extension acmeIdentifier DOIT contenir le condensat SHA-256 [FIPS180-4] de l'autorisation de clé [RFC8555] pour le défi. L'extension acmeIdentifier DOIT être critique afin que le certificat ne soit pas utilisé par inadvertance par un logiciel non ACME.

L'extension acmeIdentifier est identifiée par l'identifiant d'objet (OID) id-pe-acmeIdentifier dans l'arc id-pe [RFC5280]:

id-pe-acmeIdentifier OBJECT IDENTIFIER ::=  { id-pe 31 }

L'extension a le format ASN.1 [X.680] suivant:

Authorization ::= OCTET STRING (SIZE (32))

La valeur extnValue de l'extension id-pe-acmeIdentifier est l'encodage ASN.1 DER [X.690] de la structure Authorization, qui contient le condensat SHA-256 de l'autorisation de clé pour le défi.

Une fois ce certificat créé, il DOIT être provisionné de sorte qu'il soit retourné pendant une poignée de main TLS où le protocole de couche application acme-tls/1 a été négocié et où une extension Server Name Indication (SNI) [RFC6066] contenant le nom de domaine en cours de validation a été fournie.

Le client répond en envoyant par POST un objet JSON vide ({}) à l'URL du défi afin d'indiquer que le défi est prêt à être validé par le serveur. L'encodage base64url des en-têtes protégés et de la charge utile est décrit à la section 6.1 de [RFC8555].

POST /acme/authz/1234/1
Host: example.com
Content-Type: application/jose+json

{
"protected": base64url({
"alg": "ES256",
"kid": "https://example.com/acme/acct/1",
"nonce": "JHb54aT_KTXBWQOzGYkt9A",
"url": "https://example.com/acme/authz/1234/1"
}),
"payload": base64url({}),
"signature": "Q1bURgJoEslbD1c5...3pYdSMLio57mQNN4"
}

À la réception de cette requête d'un client, le serveur construit et stocke l'autorisation de clé à partir de la valeur token du défi et de la clé du compte client courant.

Le serveur vérifie ensuite le contrôle du client sur le domaine en vérifiant que le serveur TLS a été configuré comme attendu, selon les étapes suivantes:

  1. Le serveur ACME calcule le condensat SHA-256 attendu de l'autorisation de clé.

  2. Le serveur ACME résout le nom de domaine en cours de validation et choisit l'une des adresses IP retournées pour la validation; le serveur PEUT valider plusieurs adresses si plusieurs adresses sont retournées.

  3. Le serveur ACME initie une connexion TLS vers l'adresse IP choisie. Cette connexion DOIT utiliser le port TCP 443. Le serveur ACME DOIT fournir une extension ALPN contenant le seul nom de protocole acme-tls/1 et une extension SNI contenant uniquement le nom de domaine en cours de validation pendant la poignée de main TLS.

  4. Le serveur ACME vérifie que, pendant la poignée de main TLS, le protocole de couche application acme-tls/1 a bien été négocié, que l'extension ALPN ne contenait que la valeur acme-tls/1, et que le certificat retourné contient:

    • une extension subjectAltName contenant le dNSName en cours de validation et aucune autre entrée;

    • une extension critique acmeIdentifier contenant le condensat SHA-256 attendu calculé à l'étape 1.

La comparaison des dNSName DOIT être insensible à la casse [RFC4343]. Comme ACME ne prend pas en charge les identifiants Unicode, tous les dNSName DOIVENT être encodés selon les règles de [RFC3492].

Si toutes les étapes ci-dessus réussissent, la validation réussit. Sinon, elle échoue.