Erstellen einer signierten AWS API-Anforderung - AWS Identitäts- und Zugriffsverwaltung

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Erstellen einer signierten AWS API-Anforderung

Wichtig

Wenn Sie ein - AWS SDKs (siehe Beispielcode und Bibliotheken) oder ein AWS Befehlszeilentool (CLI) verwenden, um API-Anfragen an zu senden AWS, können Sie diesen Abschnitt überspringen, da die SDK- und CLI-Clients Ihre Anfragen mithilfe der von Ihnen bereitgestellten Zugriffsschlüssel authentifizieren. Sofern Sie keinen guten Grund dagegen haben, empfiehlt es sich, stets ein SDK oder die CLI zu verwenden.

In Regionen, die mehrere Signaturversionen unterstützen, müssen Sie beim manuellen Signieren von Anfragen angeben, welche Signaturversion verwendet wird. Wenn Sie Anfragen an Multi-Region-Zugriffspunkte stellen, wechseln SDKs und die CLI ohne zusätzliche Konfiguration automatisch zur Verwendung der Signaturversion 4A.

Im Folgenden finden Sie eine Übersicht über den Prozess zur Erstellung einer signierten Anforderung. Um eine Signatur zu berechnen, benötigen Sie zunächst eine zu signierende Zeichenfolge. Anschließend berechnen Sie mithilfe eines Signaturschlüssels einen HMAC-SHA256-Hash der zu signierenden Zeichenfolge. Das folgende Diagramm veranschaulicht den Prozess, einschließlich der verschiedenen Komponenten der Zeichenfolge, die Sie zum Signieren erstellen.


                Ein Image der Teile einer kanonischen Anfrage, der zu signierenden Zeichenfolge, des Signierschlüssels und der Signatur.

In der folgenden Tabelle werden die im Diagramm dargestellten Funktionen beschrieben. Für diese Funktionen muss Code implementiert werden. Weitere Informationen finden Sie in den Codebeispielen in den AWS SDKs .

Funktion Beschreibung

Lowercase()

Wandeln Sie die Zeichenfolge in Kleinbuchstaben um.

Hex()

Kodierung in Kleinbuchstaben im Basis-16-Format.

SHA256Hash()

Kryptografische Hash-Funktion des Secure Hash Algorithm (SHA).

HMAC-SHA256()

Berechnet HMAC unter Verwendung des SHA256-Algorithmus mit dem bereitgestellten Signaturschlüssel. Dies ist die endgültige Signatur.

Trim()

Entfernen Sie alle führenden oder nachgestellten Leerzeichen.

UriEncode()

URI-Codierung jedes Bytes. UriEncode() muss die folgenden Regeln erzwingen:

  • URI kodiert jedes Byte mit Ausnahme der nicht reservierten Zeichen: „A“–„Z“, „a“–„z“, „0“–„9“, „-“, „.“, „_“ und „~“.

  • Das Leerzeichen ist ein reserviertes Zeichen und muss als „%20“ (und nicht als „+“) codiert werden.

  • Jedes URI-codierte Byte besteht aus einem „%“ und dem zweistelligen Hexadezimalwert des Bytes.

  • Buchstaben im Hexadezimalwert müssen in Großbuchstaben geschrieben sein, zum Beispiel „%1A“.

  • Kodieren Sie den Schrägstrich „/“ überall außer im Objektschlüsselnamen. Wenn der Objektschlüsselname beispielsweise photos/Jan/sample.jpg lautet, wird der Schrägstrich im Schlüsselnamen nicht codiert.

Wichtig

Die von Ihrer Entwicklungsplattform bereitgestellten UriEncode Standardfunktionen funktionieren möglicherweise aufgrund von Unterschieden in der Implementierung und der damit verbundenen Mehrdeutigkeit in den zugrunde liegenden RFCs nicht. Wir empfehlen Ihnen, Ihre eigene benutzerdefinierte UriEncode Funktion zu schreiben, um sicherzustellen, dass Ihre Kodierung funktioniert.

Ein Beispiel für eine UriEncode Funktion in Java finden Sie unter Java-Dienstprogramme auf der - GitHub Website.

Anmerkung

Beim Signieren Ihrer Anfragen können Sie entweder AWS Signature Version 4 oder AWS Signature Version 4A verwenden. Der Hauptunterschied zwischen den beiden wird dadurch bestimmt, wie die Signatur berechnet wird. Bei AWS Signature Version 4A enthält die Signatur keine regionsspezifischen Informationen und wird mit dem AWS 4-ECDSA-P256-SHA256 Algorithmus berechnet.

Temporäre Sicherheitsanmeldeinformationen

Anstatt langfristige Anmeldeinformationen zum Signieren einer Anforderung zu verwenden, können Sie temporäre Sicherheitsanmeldeinformationen verwenden, die von AWS Security Token Service (AWS STS) bereitgestellt werden.

Wenn Sie temporäre Sicherheitsanmeldeinformationen verwenden, müssen Sie dem Autorisierungsheader oder der Abfragezeichenfolge das X-Amz-Security-Token hinzufügen, um das Sitzungstoken aufzunehmen. Bei einigen Services müssen Sie die kanonische Anforderung durch das X-Amz-Security-Token ergänzen. Bei anderen Services müssen Sie nur am Ende, nach der Berechnung der Signatur, X-Amz-Security-Token hinzufügen. Weitere Informationen finden Sie AWS-Service in der Dokumentation zu den einzelnen .

Zusammenfassung der Signierschritte

Schritt 1: Erstellen einer kanonischen Anforderung

Ordnen Sie den Inhalt Ihrer Anfrage (Host, Aktion, Header usw.) in einem standardmäßigen kanonischen Format an. Die kanonische Anforderung ist einer der Eingabewerte, anhand derer eine zu signierende Zeichenfolge erstellt wird. Details hierzu finden Sie unter Elemente einer AWS API-Anforderungssignatur.

Schritt 2: Erstellen eines Hashes der kanonischen Anforderung

Leiten Sie einen Signaturschlüssel ab, indem Sie eine Folge von verschlüsselten Hash-Operationen (HMAC-Operationen) am Anforderungsdatum, der Region und dem Service durchführen, wobei Ihr AWS geheimer Zugriffsschlüssel der Schlüssel für den ersten Hashing-Vorgang ist.

Schritt 3: Erstellen einer Zeichenfolge zum Signieren

Erstellen Sie eine zu signierende Zeichenfolge mit der kanonischen Anforderung und zusätzlichen Informationen wie Algorithmus, Anforderungsdatum, Umfang der Anmeldeinformationen und Digest (Hash) der kanonischen Anforderung.

Schritt 4: Berechnen der Signatur

Nachdem Sie den Signaturschlüssel abgeleitet haben, berechnen Sie die Signatur, indem Sie eine Keyed-Hash-Operation für die zu signierende Zeichenfolge durchführen. Verwenden Sie den abgeleiteten Signaturschlüssel als Hash-Schlüssel für diese Operation.

Schritt 5: Hinzufügen der Signatur zur Anforderung

Nachdem Sie die Signatur berechnet haben, fügen Sie sie einem HTTP-Header oder der Abfragezeichenfolge der Anforderung hinzu.

Schritt 1: Erstellen einer kanonischen Anforderung

Erstellen Sie eine kanonische Anforderung, indem Sie die folgenden Zeichenketten, getrennt durch Zeilenumbrüche, verketten. Dadurch wird sichergestellt, dass die von Ihnen berechnete Signatur und die von AWS berechnete Signatur übereinstimmen können.

<HTTPMethod>\n <CanonicalURI>\n <CanonicalQueryString>\n <CanonicalHeaders>\n <SignedHeaders>\n <HashedPayload>
  • HTTPMethod – Die HTTP-Methode, z. B. GET, PUT, HEAD und DELETE.

  • CanonicalUri – Die URI-kodierte Version des absoluten Pfadkomponenten-URI, beginnend mit dem „/“, das dem Domänennamen folgt, bis zum Ende der Zeichenfolge oder bis zum Fragezeichen („?“), wenn Sie über Parameter für Abfragezeichenfolgen verfügen. Wenn der absolute Pfad leer ist, verwenden Sie einen umgekehrten Schrägstrich (/). Beim URI im folgenden Beispiel, /examplebucket/myphoto.jpg, handelt es sich um den absoluten Pfad und Sie codieren das "/" nicht im absoluten Pfad:

    http://s3.amazonaws.com/examplebucket/myphoto.jpg
  • CanonicalQueryString – Die URI-kodierten Abfragezeichenfolgeparameter. Sie kodieren jeden Namen und jeden Wert einzeln mit dem URI. Sie müssen die Parameter in der kanonischen Abfragezeichenfolge außerdem alphabetisch nach Schlüsselnamen sortieren. Die Sortierung erfolgt nach der Codierung. Die Abfragezeichenfolge im folgenden URI-Beispiel lautet:

    http://s3.amazonaws.com/examplebucket?prefix=somePrefix&marker=someMarker&max-keys=2

    Die kanonische Abfragezeichenfolge lautet wie folgt (zur besseren Lesbarkeit wurden diesem Beispiel Zeilenumbrüche hinzugefügt):

    UriEncode("marker")+"="+UriEncode("someMarker")+"&"+ UriEncode("max-keys")+"="+UriEncode("20") + "&" + UriEncode("prefix")+"="+UriEncode("somePrefix")

    Wenn eine Anfrage auf eine Unterressource abzielt, ist der entsprechende Abfrageparameterwert eine leere Zeichenfolge („“). Der folgende URI identifiziert beispielsweise die ACL-Unterressource im examplebucket-Bucket:

    http://s3.amazonaws.com/examplebucket?acl

    CanonicalQueryString In diesem Fall lautet der wie folgt:

    UriEncode("acl") + "=" + ""

    Wenn der URI kein „?“ enthält, gibt es in der Anfrage keine Abfragezeichenfolge und Sie legen die kanonische Abfragezeichenfolge auf eine leere Zeichenfolge („“) fest. Sie müssen weiterhin das „\n“ einfügen.

  • CanonicalHeaders – Eine Liste von Anforderungs-Headern mit ihren Werten. Einzelne Header-Namens- und Wertpaare werden durch das Zeilenumbruchzeichen („\n“) getrennt. Im Folgenden finden Sie ein Beispiel für einen Canonicalheader:

    Lowercase(<HeaderName1>)+":"+Trim(<value>)+"\n" Lowercase(<HeaderName2>)+":"+Trim(<value>)+"\n" ... Lowercase(<HeaderNameN>)+":"+Trim(<value>)+"\n"

    CanonicalHeaders Die -Liste muss Folgendes enthalten:

    • HTTP-host-Header.

    • Wenn der Content-Type Header in der Anforderung vorhanden ist, müssen Sie ihn der CanonicalHeaders Liste hinzufügen.

    • Alle x-amz-*-Header, die Sie in Ihre Anfrage aufnehmen möchten, müssen ebenfalls hinzugefügt werden. Wenn Sie beispielsweise temporäre Sicherheitsanmeldeinformationen verwenden, müssen Sie x-amz-security-token in Ihre Anfrage einschließen. Sie müssen diesen Header in der Liste von hinzufügenCanonicalHeaders.

    Anmerkung

    Der x-amz-content-sha256 Header ist für Amazon S3- AWS Anforderungen erforderlich. Es stellt einen Hash der Anforderungsnutzlast bereit. Wenn keine Nutzdaten vorhanden sind, müssen Sie den Hash einer leeren Zeichenfolge bereitstellen.

    Jeder Header-Name muss:

    • Kleinbuchstaben verwenden.

    • in alphabetischer Reihenfolge erscheinen.

    • von einem Doppelpunkt (:) gefolgt sein.

    Bei Werten müssen Sie:

    • alle führenden oder nachgestellten Leerzeichen entfernen.

    • aufeinanderfolgende Leerzeichen in ein einzelnes Leerzeichen umwandeln.

    • die Werte für einen mehrwertigen Header durch Kommas trennen.

    • Sie müssen den Host-Header (HTTP/1.1) oder den :authority-Header (HTTP/2) sowie alle x-amz-*-Header in die Signatur einschließen. Sie können optional andere Standard-Header in die Signatur aufnehmen, z. B. content-type.

    Die in diesem Beispiel verwendeten Lowercase()- und Trim()-Funktionen werden im vorangehenden Abschnitt beschrieben.

    Im Folgenden finden Sie ein Beispiel für eine CanonicalHeaders-Zeichenfolge. Die Header-Namen sind in Kleinbuchstaben geschrieben und sortiert.

    host:s3.amazonaws.com x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20130708T220855Z

    Anmerkung

    Für die Berechnung einer Autorisierungssignatur sind nur der Host und etwaige x-amz-*-Header erforderlich. Um jedoch Datenmanipulationen vorzubeugen, sollten Sie erwägen, alle Header in die Signaturberechnung einzubeziehen.

  • SignedHeaders – Eine alphabetisch sortierte, durch Semikolons getrennte Liste von Anforderungs-Header-Namen in Kleinbuchstaben. Bei den Anforderungs-Headern in der Liste handelt es sich um dieselben Header, die Sie in die Zeichenfolge CanonicalHeaders eingeschlossen haben. Im vorherigen Beispiel SignedHeaders würde der Wert von beispielsweise wie folgt lauten:

    host;x-amz-content-sha256;x-amz-date
  • HashedPayload – Eine Zeichenfolge, die mit der Nutzlast im Text der HTTP-Anforderung als Eingabe für eine Hash-Funktion erstellt wurde. Diese Zeichenfolge verwendet Hexadezimalzeichen in Kleinbuchstaben.

    Hex(SHA256Hash(<payload>)

    Wenn die Anfrage keine Nutzlast enthält, berechnen Sie einen Hash der leeren Zeichenfolge wie folgt:

    Hex(SHA256Hash(""))

    Der Hash gibt den folgenden Wert zurück:

    e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

    Wenn Sie beispielsweise ein Objekt mithilfe einer PUT-Anfrage hochladen, stellen Sie Objektdaten im Textkörper bereit. Wenn Sie ein Objekt mithilfe einer GET-Anfrage abrufen, berechnen Sie den Hash der leeren Zeichenfolge.

Schritt 2: Erstellen eines Hashes der kanonischen Anforderung

Erstellen Sie einen Hash (Digest) der kanonischen Anforderung mithilfe desselben Algorithmus, den Sie zur Erstellung des Hashes der Nutzdaten verwendet haben. Der Hash der kanonischen Anfrage ist eine Zeichenfolge aus hexadezimalen Zeichen in Kleinbuchstaben.

Schritt 3: Erstellen einer zu signierenden Zeichenfolge

Erstellen Sie eine Zeichenfolge, indem Sie die folgenden Zeichenfolgen, getrennt durch Zeilenumbrüche, verketten. Beenden Sie diese Zeichenfolge nicht mit einem Zeilenumbruch.

Algorithm \n RequestDateTime \n CredentialScope \n HashedCanonicalRequest
  • Algorithmus – Der Algorithmus, der verwendet wird, um den Hash der kanonischen Anforderung zu erstellen. Für SHA-256 ist der Algorithmus AWS4-HMAC-SHA256.

  • RequestDateTime – Das Datum und die Uhrzeit, die im Geltungsbereich der Anmeldeinformationen verwendet werden. Bei diesem Wert handelt es sich um die aktuelle UTC-Zeit im ISO 8601-Format (zum Beispiel 20130524T000000Z).

  • CredentialScope – Der Umfang der Anmeldeinformationen. Dies schränkt die resultierende Signatur auf die angegebene Region und den angegebenen Service ein. Die Zeichenfolge verfügt über das folgende Format: JJJJMMDD/region/service/aws4_request.

  • HashedCanonicalRequest – Der Hash der kanonischen Anforderung. Dieser Wert wird in Schritt 2 berechnet.

Im Folgenden finden Sie ein Beispiel für eine zu signierende Zeichenfolge.

"AWS4-HMAC-SHA256" + "\n" + timeStampISO8601Format + "\n" + <Scope> + "\n" + Hex(SHA256Hash(<CanonicalRequest>))

Schritt 4: Berechnen der Signatur

In AWS Signature Version 4 erstellen Sie anstelle Ihrer AWS Zugriffsschlüssel zum Signieren einer Anforderung einen Signaturschlüssel, der auf eine bestimmte Region und einen bestimmten Service als Authentifizierungsinformationen beschränkt ist, die Sie Ihrer Anforderung hinzufügen.

DateKey = HMAC-SHA256("AWS4"+"<SecretAccessKey>", "<YYYYMMDD>") DateRegionKey = HMAC-SHA256(<DateKey>, "<aws-region>") DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "<aws-service>") SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "aws4_request")

Eine Liste der Regionszeichenfolgen finden Sie unter Regionale Endpunkte in der Allgemeinen AWS -Referenz.

Rufen Sie für jeden Schritt die Hash-Funktion mit den erforderlichen Schlüsseln und Daten auf. Das Ergebnis jedes Aufrufs der Hash-Funktion wird zur Eingabe für den nächsten Aufruf der Hash-Funktion.

Erforderliche Eingabe
  • Eine Zeichenfolge (Key), die Ihren geheimen Zugriffsschlüssel enthält

  • Eine Zeichenfolge (Date), die das im Gültigkeitsbereich der Anmeldeinformationen verwendete Datum im Format JJJJMMDD enthält

  • Eine Zeichenfolge (Region), die den Regionscode enthält (z. B. us-east-1)

  • Eine Zeichenfolge (Service), die den Servicecode enthält (z. B. ec2)

  • Die zu signierende Zeichenfolge, die Sie im vorherigen Schritt erstellt haben.

So berechnen Sie die Signatur
  1. Verketten Sie „AWS4" und den geheimen Zugriffsschlüssel. Rufen Sie die Hash-Funktion mit der verketteten Zeichenfolge als Schlüssel und der Datumszeichenfolge als Daten auf.

    kDate = hash("AWS4" + Key, Date)
  2. Rufen Sie die Hash-Funktion mit dem Ergebnis des vorherigen Aufrufs als Schlüssel und der Region-Zeichenfolge als Daten auf.

    kRegion = hash(kDate, Region)
  3. Rufen Sie die Hash-Funktion mit dem Ergebnis des vorherigen Aufrufs als Schlüssel und der Service-Zeichenfolge als Daten auf.

    kService = hash(kRegion, Service)
  4. Rufen Sie die Hash-Funktion mit dem Ergebnis des vorherigen Aufrufs als Schlüssel und „aws4_request“ als Daten auf.

    kSigning = hash(kService, "aws4_request")
  5. Rufen Sie die Hash-Funktion mit dem Ergebnis des vorherigen Aufrufs als Schlüssel und der zu signierenden Zeichenfolge als Daten auf. Das Ergebnis ist die Signatur als Binärwert.

    signature = hash(kSigning, string-to-sign)
  6. Konvertieren Sie die Signatur von der binären in die hexadezimale Darstellung in Kleinbuchstaben.

Schritt 5: Hinzufügen der Signatur zur Anforderung

Beispiel: Autorisierungsheader

Das folgende Beispiel zeigt einen Authorization-Header für die DescribeInstances-Aktion. Aus Gründen der Lesbarkeit ist dieses Beispiel mit Zeilenumbrüchen formatiert. In Ihrem Code muss dies eine fortlaufende Zeichenfolge sein. Es steht kein Komma zwischen Algorithmus und Credential. Die anderen Elemente müssen jedoch durch Kommas getrennt werden.

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request, SignedHeaders=host;x-amz-date, Signature=calculated-signature
Beispiel: Anforderung mit Authentifizierungsparametern in der Abfragezeichenfolge

Das folgende Beispiel zeigt eine Abfrage für die DescribeInstances-Aktion, die die Authentifizierungsinformationen enthält. Aus Gründen der Lesbarkeit ist dieses Beispiel mit Zeilenumbrüchen formatiert und ist nicht URL-codiert. In Ihrem Code muss die Abfragezeichenfolge eine fortlaufende Zeichenfolge sein, die URL-codiert ist.

https://ec2.amazonaws.com/? Action=DescribeInstances& Version=2016-11-15& X-Amz-Algorithm=AWS4-HMAC-SHA256& X-Amz-Credential=AKIAIOSFODNN7EXAMPLE/20220830/us-east-1/ec2/aws4_request& X-Amz-Date=20220830T123600Z& X-Amz-SignedHeaders=host;x-amz-date& X-Amz-Signature=calculated-signature

Quellcode in den AWS SDKs

Die AWS SDKs enthalten Quellcode auf GitHub zum Signieren von AWS API-Anforderungen. Codebeispiele finden Sie unter Beispielprojekte im AWS Beispiel-Repository.