Zum Hauptinhalt springen

3. TLS ALPN Challenge (TLS-ALPN-Challenge)

3. TLS with Application-Layer Protocol Negotiation (TLS ALPN) Challenge (TLS-ALPN-Challenge)

Die Validierungsmethode TLS mit Application-Layer Protocol Negotiation (ALPN) beweist die Kontrolle über einen Domainnamen, indem sie verlangt, dass der ACME-Client einen TLS-Server so konfiguriert, dass er auf bestimmte Verbindungsversuche mit der ALPN-Erweiterung und Identifikationsinformationen antwortet. Der ACME-Server validiert die Kontrolle über den Domainnamen, indem er eine Verbindung zu einem TLS-Server unter einer der für den Domainnamen aufgelösten Adressen herstellt und überprüft, dass ein Zertifikat mit bestimmtem Inhalt präsentiert wird.

Das ACME-Challenge-Objekt tls-alpn-01 hat folgendes Format:

type (erforderlich, Zeichenkette): die Zeichenkette tls-alpn-01

token (erforderlich, Zeichenkette): ein Zufallswert, der die Challenge eindeutig identifiziert. Dieser Wert MUSS mindestens 128 Bit Entropie haben. Er DARF KEINE Zeichen außerhalb des in Abschnitt 5 von [RFC4648] beschriebenen base64url-Alphabets enthalten. Nachgestellte =-Padding-Zeichen MÜSSEN entfernt werden. Siehe [RFC4086] für weitere Informationen zu Zufallsanforderungen.

Der Client bereitet die Validierung vor, indem er ein selbstsigniertes Zertifikat erstellt, das die Erweiterung acmeIdentifier und die Erweiterung subjectAlternativeName [RFC5280] enthalten MUSS. Die Erweiterung subjectAlternativeName MUSS einen einzigen dNSName-Eintrag enthalten, dessen Wert der zu validierende Domainname ist. Die Erweiterung acmeIdentifier MUSS den SHA-256-Hash [FIPS180-4] der Key Authorization (Schlüsselautorisierung) [RFC8555] für die Challenge enthalten. Die Erweiterung acmeIdentifier MUSS kritisch sein, damit das Zertifikat nicht versehentlich von Nicht-ACME-Software verwendet wird.

Die Erweiterung acmeIdentifier wird durch den Object Identifier (OID) id-pe-acmeIdentifier im id-pe-Arc [RFC5280] identifiziert:

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

Die Erweiterung hat folgendes ASN.1 [X.680]-Format:

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

Der extnValue der Erweiterung id-pe-acmeIdentifier ist die ASN.1-DER-Kodierung [X.690] der Struktur Authorization, die den SHA-256-Hash der Key Authorization für die Challenge enthält.

Sobald dieses Zertifikat erstellt wurde, MUSS es so bereitgestellt werden, dass es während eines TLS-Handshakes zurückgegeben wird, in dem das Anwendungsschichtprotokoll acme-tls/1 ausgehandelt wurde und eine Server Name Indication (SNI)-Erweiterung [RFC6066] mit dem zu validierenden Domainnamen vorliegt.

Ein Client antwortet, indem er ein leeres JSON-Objekt ({}) per POST an die Challenge-URL sendet, um zu bestätigen, dass die Challenge vom Server validiert werden kann. Die base64url-Kodierung der geschützten Header und der Nutzlast ist in Abschnitt 6.1 von [RFC8555] beschrieben.

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"
}

Nach Eingang dieser Anfrage vom Client konstruiert der Server die Key Authorization aus dem token-Wert der Challenge und dem aktuellen Client-Kontoschlüssel und speichert sie.

Der Server verifiziert anschließend die Kontrolle des Clients über die Domain, indem er überprüft, dass der TLS-Server wie erwartet konfiguriert wurde, mit folgenden Schritten:

  1. Der ACME-Server berechnet den erwarteten SHA-256-Hash der Key Authorization.

  2. Der ACME-Server löst den zu validierenden Domainnamen auf und wählt eine der zurückgegebenen IP-Adressen für die Validation (der Server KANN gegen mehrere Adressen validieren, wenn mehr als eine zurückgegeben wird).

  3. Der ACME-Server initiiert eine TLS-Verbindung zur gewählten IP-Adresse. Diese Verbindung MUSS TCP-Port 443 verwenden. Der ACME-Server MUSS eine ALPN-Erweiterung mit dem einzelnen Protokollnamen acme-tls/1 und eine SNI-Erweiterung, die nur den zu validierenden Domainnamen enthält, während des TLS-Handshakes bereitstellen.

  4. Der ACME-Server verifiziert, dass während des TLS-Handshakes das Anwendungsschichtprotokoll acme-tls/1 erfolgreich ausgehandelt wurde (und dass die ALPN-Erweiterung nur den Wert acme-tls/1 enthielt) und dass das zurückgegebene Zertifikat enthält:

    • eine subjectAltName-Erweiterung mit dem zu validierenden dNSName und keinen weiteren Einträgen

    • eine kritische acmeIdentifier-Erweiterung mit dem in Schritt 1 berechneten erwarteten SHA-256-Hash

Der Vergleich von dNSName-Werten MUSS ohne Berücksichtigung der Groß-/Kleinschreibung erfolgen [RFC4343]. Da ACME keine Unicode-Identifikatoren unterstützt, MÜSSEN alle dNSName-Werte nach den Regeln von [RFC3492] kodiert werden.

Wenn alle obigen Schritte erfolgreich sind, ist die Validation erfolgreich. Andernfalls schlägt sie fehl.