Erstellen Sie ein signiertes AWS APIAnfrage - 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 Sie ein signiertes AWS APIAnfrage

Wichtig

Wenn Sie eine verwenden AWS SDK(siehe Beispielcode und Bibliotheken) oder AWS Command Line Interface (AWS CLI) Tool zum Senden von API Anfragen an AWS, Sie können diesen Abschnitt überspringen, da die SDK und CLI -Clients Ihre Anfragen mit den von Ihnen bereitgestellten Zugriffsschlüsseln authentifizieren. Sofern Sie keinen guten Grund haben, dies nicht zu tun, empfehlen wir Ihnen, immer eine SDK oder die CLI zu verwenden.

In Regionen, die mehrere Signaturversionen unterstützen, bedeutet das manuelle Signieren von Anfragen, dass Sie angeben müssen, welche Signaturversion verwendet wird. Wenn Sie Anfragen an Access Points mit mehreren Regionen bereitstellen SDKs und dann CLI automatisch ohne zusätzliche Konfiguration zur Verwendung von Signature Version 4A wechseln.

Sie können das AWS SigV4-Signaturprotokoll zum Erstellen einer signierten Anfrage für AWS APIAnfragen.

  1. Erstellen einer kanonischen Anfrage auf der Grundlage der Anforderungsdetails.

  2. Berechnung einer Signatur mit Ihrem AWS Anmeldeinformationen.

  3. Hinzufügen dieser Signatur zur Anfrage als Autorisierungsheader.

AWS repliziert dann diesen Prozess und verifiziert die Signatur, wobei der Zugriff entsprechend gewährt oder verweigert wird.

Um zu sehen, wie Sie Folgendes verwenden können AWS Sigv4 zum Signieren von API Anfragen finden Sie unter Anfordern von Signaturbeispielen

Das folgende Diagramm veranschaulicht den Sigv4-Signaturprozess, 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 im 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()

URIkodiert jedes Byte. UriEncode() muss die folgenden Regeln durchsetzen:

  • URIkodiert 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 kodierte 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 der zugrunde liegenden Funktionen nicht. RFCs 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 Utilities auf der GitHub Website.

Anmerkung

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

Signieren von Anfragen mit temporären Sicherheitsanmeldedaten

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

Wenn Sie temporäre Sicherheitsanmeldedaten verwenden, müssen Sie sie dem Autorisierungsheader hinzufügen X-Amz-Security-Token oder ihn in die Abfragezeichenfolge aufnehmen, 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. Schauen Sie in der jeweiligen Dokumentation nach AWS-Service für spezifische Anforderungen.

Zusammenfassung der Signierschritte

Erstellen Sie eine kanonische Anfrage:

Ordnen Sie den Inhalt Ihrer Anfrage (Host, Aktion, Header usw.) in einem standardmäßigen kanonischen Format an. Die kanonische Anfrage ist eine der Eingaben, die verwendet werden, um die zu signierende Zeichenfolge zu erstellen. Einzelheiten zur Erstellung der kanonischen Anfrage finden Sie unter. Elemente einer AWS API Anforderungssignatur

Erstellen Sie einen Hash der kanonischen Anfrage

Hashen Sie die kanonische Anfrage mit demselben Algorithmus, mit dem Sie den Hash der Nutzlast erstellt haben. Der Hash der kanonischen Anfrage ist eine Zeichenfolge aus hexadezimalen Zeichen in Kleinbuchstaben.

Erstellen Sie eine Zeichenfolge zum Signieren

Erstellen Sie eine Zeichenfolge zum Signieren mit der kanonischen Anfrage und zusätzlichen Informationen wie dem Algorithmus, dem Anforderungsdatum, dem Gültigkeitsbereich der Anmeldeinformationen und dem Hash der kanonischen Anfrage.

Leiten Sie einen Signaturschlüssel ab

Führen Sie eine Reihe von verschlüsselten Hash-Operationen (HMAC) für das Anforderungsdatum, die Region und den Dienst mit Ihrem AWS geheimer Zugriffsschlüssel als Schlüssel für den ersten Hashvorgang.

Berechne die Signatur

Führen Sie eine Schlüssel-Hash-Operation (HMAC) für die zu signierende Zeichenfolge aus, wobei Sie den abgeleiteten Signaturschlüssel als Hashschlüssel verwenden.

Fügen Sie der Anfrage die Signatur hinzu

Fügen Sie die berechnete Signatur einem HTTP Header oder der Abfragezeichenfolge der Anfrage hinzu.

Erstellen Sie eine kanonische Anfrage

Um eine kanonische Anfrage zu erstellen, verketten Sie die folgenden Zeichenketten, getrennt durch Zeilenumbruchzeichen. Auf diese Weise wird sichergestellt, dass die von Ihnen berechnete Signatur mit der Signatur übereinstimmen kann AWS berechnet.

<HTTPMethod>\n <CanonicalURI>\n <CanonicalQueryString>\n <CanonicalHeaders>\n <SignedHeaders>\n <HashedPayload>
  • HTTPMethod — Die HTTP Methode, wieGET, PUTHEAD, undDELETE.

  • CanonicalUri — Die URI -kodierte Version der absoluten PfadkomponenteURI, beginnend mit dem/, was auf den Domainnamen folgt, bis zum Ende der Zeichenfolge oder bis zum Fragezeichen (?), wenn Sie Parameter für die Abfragezeichenfolge haben. Wenn der absolute Pfad leer ist, verwenden Sie einen Schrägstrich (). / URIIm folgenden Beispiel,/amzn-s3-demo-bucket/myphoto.jpg, ist der absolute Pfad, und Sie kodieren den nicht / im absoluten Pfad:

    http://s3.amazonaws.com/amzn-s3-demo-bucket/myphoto.jpg
  • CanonicalQueryString — Die Parameter der URI -kodierten Abfragezeichenfolge. Sie URI -kodieren jeden Namen und Wert einzeln. 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/amzn-s3-demo-bucket?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 ()"". Im Folgenden wird beispielsweise die ACL Unterressource im Bucket URI identifiziert: amzn-s3-demo-bucket

    http://s3.amazonaws.com/amzn-s3-demo-bucket?acl

    In diesem Fall CanonicalQueryString wäre das:

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

    Wenn URI das keine enthält?, enthält die Anfrage keine Abfragezeichenfolge, und Sie setzen die kanonische Abfragezeichenfolge auf eine leere Zeichenfolge ()"". Sie müssen trotzdem das Zeilenumbruchzeichen () angeben. "\n"

  • CanonicalHeaders — Eine Liste von Anforderungsheadern mit ihren Werten. Einzelne Headernamen- und Wertepaare werden durch das Zeilenumbruchzeichen () "\n" getrennt. Das Folgende ist ein Beispiel für ein CanonicalHeader:

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

    CanonicalHeaders Die Liste muss Folgendes enthalten:

    • HTTPhostKopfzeile.

    • Wenn der Content-Type Header in der Anfrage vorhanden ist, müssen Sie ihn zur CanonicalHeaders Liste.

    • 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 zur Liste von hinzufügen CanonicalHeaders.

    Anmerkung

    Der x-amz-content-sha256 Header ist für Amazon S3 erforderlich AWS Anfragen. 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.

    • gefolgt von einem Doppelpunkt (:).

    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 aufnehmen. 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 kleingeschriebener Request-Header-Namen. Bei den Anforderungs-Headern in der Liste handelt es sich um dieselben Header, die Sie in die Zeichenfolge CanonicalHeaders eingeschlossen haben. Für das vorherige Beispiel ist der Wert von SignedHeaders wäre wie folgt:

    host;x-amz-content-sha256;x-amz-date
  • HashedPayload — Eine Zeichenfolge, die unter Verwendung der Nutzdaten im Hauptteil der HTTP Anfrage 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 aus der leeren Zeichenfolge. Wenn Sie beispielsweise ein Objekt mithilfe einer GET Anfrage abrufen, enthält die Nutzlast nichts.

    Hex(SHA256Hash(""))
    Anmerkung

    Fügen Sie für Amazon S3 die Literalzeichenfolge ein, UNSIGNED-PAYLOAD wenn Sie eine kanonische Anfrage erstellen, und legen Sie beim Senden der Anfrage denselben Wert wie den x-amz-content-sha256 Header-Wert fest.

    Hex(SHA256Hash("UNSIGNED-PAYLOAD"))

Erstellen Sie einen Hash der kanonischen Anfrage

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.

Erstellen Sie eine Zeichenfolge zum Signieren

Um eine zu signierende Zeichenfolge zu erstellen, verketten Sie die folgenden Zeichenketten, getrennt durch Zeilenumbruchzeichen. Beenden Sie diese Zeichenfolge nicht mit einem Zeilenumbruch.

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

  • RequestDateTime — Das Datum und die Uhrzeit, die im Bereich der Anmeldeinformationen verwendet werden. Dieser Wert ist die aktuelle UTC Uhrzeit im Format ISO 8601 (z. B.20130524T000000Z).

  • CredentialScope — Der Gültigkeitsbereich der Anmeldeinformationen, der die resultierende Signatur auf die angegebene Region und den angegebenen Dienst beschränkt. Die Zeichenfolge hat das folgende Format: YYYYMMDD/region/service/aws4_request.

  • HashedCanonicalRequest — Der Hash der kanonischen Anfrage, berechnet im vorherigen Schritt.

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

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

Leitet einen Signaturschlüssel ab

Um einen Signaturschlüssel abzuleiten, führen Sie eine Reihe von verschlüsselten Hashoperationen (HMAC) am Anforderungsdatum, in der Region und im Dienst durch, wobei AWS geheimer Zugriffsschlüssel als Schlüssel für den ersten Hashing-Vorgang.

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.

Das folgende Beispiel zeigt, wie Sie den im nächsten Abschnitt dieses Verfahrens SigningKey verwendeten Wert ableiten, und zeigt die Reihenfolge, in der Ihre Eingabe verkettet und gehasht wird. HMAC-SHA256ist die Hash-Funktion, die verwendet wird, um die Daten wie in der Abbildung zu hashen.

DateKey = HMAC-SHA256("AWS4"+"<SecretAccessKey>", "<YYYYMMDD>") DateRegionKey = HMAC-SHA256(<DateKey>, "<aws-region>") DateRegionServiceKey = HMAC-SHA256(<DateRegionKey>, "<aws-service>") SigningKey = HMAC-SHA256(<DateRegionServiceKey>, "aws4_request")
Erforderliche Eingabe
  • Key, eine Zeichenfolge, die Ihren geheimen Zugriffsschlüssel enthält.

  • Date, eine Zeichenfolge, die das im Bereich der Anmeldeinformationen verwendete Datum im Format YYYYMMDDenthält.

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

    Eine Liste der Regionszeichenfolgen finden Sie unter Regionale Endpunkte im Allgemeine AWS-Referenz.

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

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

Um einen Signaturschlüssel abzuleiten
  1. Concatenate "AWS4" und der geheime Zugriffsschlüssel. Rufen Sie die Hash-Funktion mit der verketteten Zeichenfolge als Schlüssel und der Datumszeichenfolge als Daten auf.

    DateKey = 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.

    DateRegionKey = 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.

    Der Servicecode wird vom Dienst definiert. Sie können get-products in der verwenden AWS Preisgestaltung für CLI die Rückgabe des Servicecodes für einen Service.

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

    SigningKey = hash(kService, "aws4_request")

Berechne die Signatur

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

So berechnen Sie eine Signatur
  1. 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(SigningKey, string-to-sign)
  2. Konvertieren Sie die Signatur von der binären in die hexadezimale Darstellung in Kleinbuchstaben.

Fügen Sie der Anfrage die Signatur hinzu

Fügen Sie die berechnete Signatur zu Ihrer Anfrage hinzu.

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 besseren Lesbarkeit ist dieses Beispiel mit Zeilenumbrüchen formatiert und nicht URL codiert. In Ihrem Code muss die Abfragezeichenfolge eine fortlaufende Zeichenfolge sein, die codiert ist. URL

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