Zum Hauptinhalt springen

3.1. Creating a Signature (Signaturerzeugung)

3.1. Creating a Signature (Signaturerzeugung)

Die Erzeugung einer HTTP-Nachrichtensignatur nimmt als Eingabe den Signaturkontext (einschließlich der Zielnachricht) und die Anforderungen der Anwendung. Ausgabe sind ein Signaturwert und Signaturparameter, die dem Verifizierenden durch Anfügen an die Nachricht mitgeteilt werden können.

Um eine Signatur zu erzeugen, MUSS der Signierende folgenden Algorithmus anwenden:

  1. Der Signierende wählt einen HTTP-Signaturalgorithmus und Schlüsselmaterial aus der Menge möglicher Signaturalgorithmen. Diese Menge legt die Anwendung fest und liegt außerhalb dieses Dokuments. Das Schlüsselmaterial MUSS zum Algorithmus passen und dessen Anforderungen (z. B. Schlüssellänge, Format) erfüllen. Die Wahl von Algorithmus und Schlüsselmaterial liegt außerhalb dieses Dokuments.

  2. Der Signierende setzt die Erstellungszeit (creation time) der Signatur auf die aktuelle Zeit.

  3. Falls zutreffend, setzt der Signierende die Ablaufzeit (expiration time) auf den Zeitpunkt, zu dem die Signatur ablaufen soll. Die Ablaufzeit ist ein Hinweis an den Verifizierenden, ab wann der Signierende die Signatur nicht mehr bestätigt. Angemessene Ablaufdauer und Verarbeitung dieses Parameters sind anwendungsspezifisch.

  4. Der Signierende erzeugt eine geordnete Menge von Komponenten-Identifikatoren für die abzudeckenden Nachrichtenkomponenten und hängt Signatur-Metadatenparameter an diese Menge. Der serialisierte Wert dieser Menge wird später als Wert des Feldes Signature-Input verwendet (Abschnitt 4.1).

    • Ist die Reihenfolge der abgedeckten Komponenten einmal gewählt, DARF sie für die Lebensdauer der Signatur NICHT geändert werden.

    • Jeder abgedeckte Komponenten-Identifikator MUSS entweder (1) ein HTTP-Feld (Abschnitt 2.1) im Signaturkontext oder (2) eine in Abschnitt 2.2 oder im Register „HTTP Signature Derived Component Names“ aufgeführte abgeleitete Komponente sein.

    • Signierende einer Anfrage SOLLEN einen Teil oder alle Steuerdaten der Nachricht abdecken, z. B. @method, @authority, @target-uri oder Kombinationen.

    • Signierende SOLLEN den Metadatenparameter created aufnehmen, um die Erstellungszeit anzugeben.

    • Der abgeleitete Komponenten-Identifikator @signature-params DARF NICHT in der Liste der abgedeckten Komponenten vorkommen. Diese abgeleitete Komponente ist stets die letzte Zeile der Signaturbasis, sodass die Signatur immer ihre eigenen Metadaten abdeckt und diese nicht ersetzbar sind.

    • Weitere Hinweise zu Inhalt und Reihenfolge liegen außerhalb dieses Dokuments.

  5. Der Signierende erzeugt die Signaturbasis mit diesen Parametern und dem Algorithmus aus Abschnitt 2.5.

  6. Der Signierende wendet die Primitive HTTP_SIGN an, um die Signaturbasis mit dem gewählten Algorithmus und Schlüsselmaterial zu signieren. HTTP_SIGN und konkrete Algorithmen sind in Abschnitt 3.3 definiert.

  7. Das Byte-Array-Ergebnis der Signaturfunktion ist der auszugebende Wert der HTTP-Nachrichtensignatur für das Feld Signature (Abschnitt 4.2).

Beispiel: Für die HTTP-Nachricht und Signaturparameter aus Abschnitt 2.5 wird die Beispiel-Signaturbasis mit dem Schlüssel test-key-rsa-pss (Anhang B.1.2) und RSASSA-PSS (Abschnitt 3.3.1) signiert; der folgende Signaturausgabewert ist Base64-kodiert (Zeilenumbruch gemäß [RFC8792]):

HIbjHC5rS0BYaa9v4QfD4193TORw7u9edguPh0AW3dMq9WImrlFrCGUDih47vAxi4L2\
YRZ3XMJc1uOKk/J0ZmZ+wcta4nKIgBkKq0rM9hs3CQyxXGxHLMCy8uqK488o+9jrptQ\
+xFPHK7a9sRL1IXNaagCNN3ZxJsYapFj+JXbmaI5rtAdSfSvzPuBCh+ARHBmWuNo1Uz\
VVdHXrl8ePL4cccqlazIJdC4QEjrF+Sn4IxBQzTZsL9y9TP5FsZYzHvDqbInkTNigBc\
E9cKOYNFCn4D/WM7F6TNuZO9EgtzepLWcjTymlHzK7aXq6Am6sfOrpIC49yXjj3ae6H\
RalVc/g==

Abbildung 2: Nicht normatives Beispiel eines Signaturwertes

RSASSA-PSS ist nicht deterministisch; bei jedem Lauf entsteht ein anderer Signaturwert. Der hier gezeigte Wert ist mit den angegebenen Schlüsseln verifizierbar, neu erzeugte Werte stimmen nicht mit dem Beispiel überein. Siehe Abschnitt 7.3.5.