

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.

# Signieren und Authentifizieren von REST-Anfragen (AWS Signatur (Version 2)
<a name="RESTAuthentication"></a>

**Topics**
+ [Verwenden von temporären Sicherheitsanmeldeinformationen](#UsingTemporarySecurityCredentials)
+ [Der Authentifizierungsheader](#ConstructingTheAuthenticationHeader)
+ [Anfordern einer Kanonisierung für die Signatur](#RESTAuthenticationRequestCanonicalization)
+ [CanonicalizedResource Konstruieren des Elements](#ConstructingTheCanonicalizedResourceElement)
+ [Das Element konstruieren CanonicalizedAmzHeaders](#RESTAuthenticationConstructingCanonicalizedAmzHeaders)
+ [Positionelle und benannte HTTP-Header-Elemente StringToSign](#RESTAuthenticationStringToSign)
+ [Zeitstempel-Anforderung](#RESTAuthenticationTimeStamp)
+ [Authentifizierungsbeispiele](#RESTAuthenticationExamples)
+ [Probleme mit dem Signieren von REST-Anforderungen](#RESTAuthenticationDebugging)
+ [Alternative zur Authentifizierung der Abfragezeichenfolge](#RESTAuthenticationQueryStringAuth)

**Anmerkung**  
Dieses Thema erklärt Authentifizierungsanfragen unter Verwendung von Signature Version 2. Amazon S3 unterstützt jetzt die neueste Signature Version 4. Diese neueste Signatur-Version wird in allen Regionen unterstützt. Alle neuen Regionen unterstützen nach dem 30. Januar 2014 nur Signature Version 4. Weitere Informationen finden Sie unter [ Authentifizieren von Anfragen (AWS Signature Version 4) ](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) in der * Amazon Simple Storage Service API-Referenz. *

 Die Authentifizierung ist der Prozess, Ihre Identität gegenüber dem System nachzuweisen. Die Identität ist ein wichtiger Faktor in den Zugriffssteuerungsentscheidungen von Amazon S3. Anforderungen werden zum Teil basierend auf der Identität des Auftraggebers zugelassen oder abgewiesen. Das Recht, Buckets zu erstellen, ist beispielsweise für registrierte Entwickler reserviert (standardmäßig), und das Recht, Objekte in einem Bucket zu erstellen, ist für den Eigentümer des betreffenden Buckets reserviert. Als Entwickler machen Sie Anforderungen, für die diese Berechtigungen gelten müssen, deshalb müssen Sie Ihre Identität gegenüber dem System belegen, indem Sie Ihre Anforderungen authentifizieren. In diesem Abschnitt erfahren Sie mehr darüber. 

**Anmerkung**  
 Der Inhalt dieses Abschnitts gilt nicht für HTTP POST. Weitere Informationen finden Sie unter [Browser-based lädt mit POST () hoch AWS Signatur (Version 2)](UsingHTTPPOST.md). 

 Die Amazon-S3-REST-API verwendet ein allgemeines HTTP-Schema basierend auf einem verschlüsselten HMAC (Hash Message Authentication Code) für die Authentifizierung. Um eine Anforderung zu authentifizieren, verknüpfen Sie zuerst ausgewählte Elemente der Anforderung, um eine Zeichenfolge zu erstellen. Anschließend verwenden Sie Ihren AWS geheimen Zugriffsschlüssel, um den HMAC dieser Zeichenfolge zu berechnen. Informell wird dieser Vorgang als „Signieren der Anfrage“ bezeichnet, und die Ausgabe des HMAC-Algorithmus ist die Signatur, da sie die Sicherheitseigenschaften einer echten Signatur simuliert. Schließlich fügen Sie diese Signatur als Parameter der Anforderung hinzu. Dazu verwenden Sie die in diesem Abschnitt beschriebene Syntax. 

 Wenn das System eine authentifizierte Anfrage erhält, ruft es den AWS geheimen Zugriffsschlüssel ab, den Sie angeblich besitzen, und verwendet ihn auf die gleiche Weise, um eine Signatur für die empfangene Nachricht zu berechnen. Anschließend vergleicht es die berechnete Signatur mit der Signatur, die der Anforderer vorgezeigt hat. Wenn die beiden Signaturen übereinstimmen, kommt das System zu dem Schluss, dass der Anforderer Zugriff auf den AWS geheimen Zugriffsschlüssel haben muss, und handelt daher mit der Autorität des Prinzipals, an den der Schlüssel ausgestellt wurde. Stimmen die beiden Signaturen nicht überein, wird die Anforderung verworfen und das System antwortet mit einer Fehlermeldung. 

**Example Authentifizierte Amazon S3 REST-Anfrage**  

```
1. GET /photos/puppy.jpg HTTP/1.1
2. Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
3. Date: Tue, 27 Mar 2007 19:36:42 +0000
4. 
5. {{Authorization: AWS AKIAIOSFODNN7EXAMPLE:
6. qgk2+6Sv9/oM7G3qLEjTH1a1l1g=}}
```

## Verwenden von temporären Sicherheitsanmeldeinformationen
<a name="UsingTemporarySecurityCredentials"></a>

Wenn Sie Ihre Anfrage unter Verwendung temporärer Sicherheitsanmeldeinformationen signieren (siehe [Senden von Anforderungen](MakingRequests.md)), müssen Sie das entsprechende Sicherheitstoken in Ihre Anfrage aufnehmen, indem Sie den `x-amz-security-token`-Header hinzufügen. 

Wenn Sie unter Verwendung der AWS -Security-Token-Service API temporäre Sicherheitsanmeldeinformationen erhalten haben, beinhaltet die Antwort temporäre Sicherheitsanmeldeinformationen und ein Sitzungstoken. Sie geben den Wert des Sitzungstokens im `x-amz-security-token`-Header an, wenn Sie Anfragen an Amazon S3 senden. Informationen zur von IAM bereitgestellten AWS -Security-Token-Service API finden Sie [ im *AWS -Security-Token-Service API-Referenzhandbuch unter*](https://docs.aws.amazon.com/STS/latest/APIReference/API_Operations.html) Action.

## Der Authentifizierungsheader
<a name="ConstructingTheAuthenticationHeader"></a>

Die Amazon-S3-REST-API verwendet den standardmäßigen HTTP-`Authorization`-Header, um Authentifizierungs-Informationen weiterzugeben. (Der Name des Standardheaders ist unglücklich gewählt, weil er eine Authentifizierung weitergibt, keine Autorisierung.) Unter dem Amazon-S3-Authentifizierungsschema hat der Autorisierungsheader die folgende Form:

```
1. Authorization: AWS {{AWSAccessKeyId}}:{{Signature}}
```

Entwickler erhalten bei der Registrierung eine AWS Zugriffsschlüssel-ID und einen AWS geheimen Zugriffsschlüssel. Für die Anforderungs-Authentifizierung identifiziert das `AWSAccessKeyId`-Element die Zugriffsschlüssel-ID, die für die Berechnung der Signatur verwendet wurde, und indirekt für den Entwickler steht, der die Anforderung gestellt hat.

Das `Signature` Element ist der RFC 2104 HMAC-SHA1 der ausgewählten Elemente aus der Anfrage, weshalb der `Signature` Teil des Authorization-Headers von Anfrage zu Anfrage unterschiedlich ist. Wenn die vom System berechnete Anforderungssignatur mit der in der Anfrage `Signature` enthaltenen übereinstimmt, hat der Anforderer nachgewiesen, dass er im Besitz des AWS geheimen Zugangsschlüssels ist. die Anforderung wird unter der Identität verarbeitet, und mit der Genehmigung des Entwicklers, dem der Schlüssel ausgestellt wurde.

Die folgende Pseudogrammatik verdeutlicht den Aufbau des `Authorization`-Anforderungs-Headers. (In dem Beispiel steht `\n` für den Unicode-Code `U+000A`, häufig auch als Newline bezeichnet.) 

```
 1. Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature;
 2. 
 3. Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of(YourSecretAccessKey), UTF-8-Encoding-Of( StringToSign ) ) );
 4. 
 5. StringToSign = HTTP-Verb + "\n" +
 6. 	Content-MD5 + "\n" +
 7. 	Content-Type + "\n" +
 8. 	Date + "\n" +
 9. 	CanonicalizedAmzHeaders +
10. 	CanonicalizedResource;
11. 
12. CanonicalizedResource = [ "/" + Bucket ] +
13. 	<HTTP-Request-URI, from the protocol name up to the query string> +
14. 	[ subresource, if present. For example "?acl", "?location", or "?logging"];
15. 
16. CanonicalizedAmzHeaders = <described below>
```

 HMAC-SHA1 ist ein in [ RFC 2104 definierter Algorithmus Keyed-Hashing für die Nachrichtenauthentifizierung. ](http://www.ietf.org/rfc/rfc2104.txt) Der Algorithmus nimmt zwei Byte-Zeichenfolgen als Eingabe entgegen, einen Schlüssel und eine Nachricht. Verwenden Sie für die Amazon S3-Anforderungsauthentifizierung Ihren AWS geheimen Zugriffsschlüssel (`YourSecretAccessKey`) als Schlüssel und die UTF-8 Kodierung von `StringToSign` als Nachricht. Die Ausgabe von HMAC-SHA1 ist ebenfalls eine Bytezeichenfolge, die als Digest bezeichnet wird. Der `Signature`-Anforderungsparameter wird durch eine Base64-Codierung dieses Digest erstellt. 

## Anfordern einer Kanonisierung für die Signatur
<a name="RESTAuthenticationRequestCanonicalization"></a>

 Wenn das System eine authentifizierte Anforderung erhält, vergleicht es die berechnete Anforderungssignatur mit der in der Anforderung im breitgestellten Signatur, wie bereits beschriebe `StringToSign`. Aus diesem Grund müssen Sie die Signatur nach derselben Methode berechnen, die auch Amazon S3 verwendet. Der Vorgang, bei dem eine Anfrage zur Unterzeichnung der Kanonisierung in einer vereinbarten Form gestellt wird. * * 

## CanonicalizedResource Konstruieren des Elements
<a name="ConstructingTheCanonicalizedResourceElement"></a>

 `CanonicalizedResource` stellt die für die Anfrage relevante Amazon-S3-Ressource dar. Für eine REST-Anforderung erstellen Sie sie wie folgt: 

1.  Beginnen Sie mit einer leeren Zeichenfolge (`""`). 

1. Wenn die Anforderung unter Verwendung des HTTP Host-Headers (virtueller gehosteter Stils) einen Bucket angibt, fügen Sie den Bucket-Namen mit vorgestelltem `"/"` an (z. B. „/bucketname“). Für Anforderungen im Pfad-Stil und Anforderungen, die an keinen spezifischen Bucket gerichtet sind, machen Sie nichts. Weitere Informationen zu Anfragen im virtuellen Hosting-Stil finden Sie unter [ Virtuelles Hosten von Buckets. ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html) 

   Für eine virtuelle Hosting-Anfrage "" ist das https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg „/awsexamplebucket1". `CanonicalizedResource` 

   Für die Anfrage im Pfadstil "" ist das „“. https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg `CanonicalizedResource`

1. Hängen Sie den Pfadteil des nicht dekodierten HTTP an, bis zur Request-URI Abfragezeichenfolge, aber nicht einschließlich.

   Für eine virtuelle Hosting-Anfrage "" ist das https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg `CanonicalizedResource` „//puppy.jpg“. awsexamplebucket1/photos

   Für eine Anfrage im Pfadstil "" `CanonicalizedResource` ist das https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg „//puppy.jpg“. awsexamplebucket1/photos An dieser Stelle ist der `CanonicalizedResource` für Anforderungen mit virtuell gehostetem Stil und Pfad-Stil gleich.

   Im Fall einer Anforderung, die sich nicht an einen Bucket richtet, wie [GET Service](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTServiceGET.html), fügen Sie „/“ an.

1. Wenn sich die Anforderung an eine Subressource richtet, wie beispielsweise `?versioning`, `?location`, `?acl`, `?lifecycle`, oder `?versionid`, fügen Sie die Subressource an, gegebenenfalls ihren Wert und das Fragezeichen. Beachten Sie, dass bei mehreren Unterressourcen die Unterressourcen lexikografisch nach dem Namen der Unterressource sortiert und durch '&' getrennt werden müssen, z. B.? ACL&VersionId=. {{value}} 

   Die Unterressourcen, die bei der Erstellung des CanonicalizedResource Elements berücksichtigt werden müssen, sind acl, lifecycle, location, logging, notification, partNumber, policy, requestPayment, UploadID, uploads, versionId, versioning, versions und website. 

   Wenn die Anfrage Abfragezeichenfolgen-Parameter angibt, die die Antwort-Header-Werte überschreiben (siehe [Get Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html)), fügen Sie die Abfragezeichenfolgen-Parameter und ihre Werte an. Bei einer Signatur codieren Sie diese Werte nicht. Bei einer Anforderung dagegen müssen Sie diese Parameterwerte codieren. Die Abfrageparameter in einer GET-Anforderung sind unter anderem `response-content-type`, `response-content-language`, `response-expires`, `response-cache-control`, `response-content-disposition` und `response-content-encoding`.

   Der `delete` Abfragezeichenfolgenparameter muss enthalten sein, wenn Sie die Löschanforderung für mehrere Objekte erstellen. CanonicalizedResource 

Elemente von CanonicalizedResource , die aus dem HTTP stammen, Request-URI sollten wörtlich so signiert werden, wie sie in der HTTP-Anfrage vorkommen, einschließlich URL-Encoding Metazeichen. 

Das `CanonicalizedResource` könnte anders sein als das HTTP Request-URI. Insbesondere, wenn Ihre Anfrage den `Host` HTTP-Header verwendet, um einen Bucket anzugeben, erscheint der Bucket nicht im HTTP Request-URI. Die `CanonicalizedResource` beinhaltet den Bucket jedoch weiterhin. Abfragezeichenfolgenparameter können auch in der vorkommen Request-URI , sind aber nicht in enthalten`CanonicalizedResource`. Weitere Informationen finden Sie unter [ Virtuelles Hosten von Buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html). 

## Das Element konstruieren CanonicalizedAmzHeaders
<a name="RESTAuthenticationConstructingCanonicalizedAmzHeaders"></a>

Um den CanonicalizedAmzHeaders Teil von zu konstruieren`StringToSign`, wählen Sie alle HTTP-Anforderungsheader aus, die mit 'x-amz-' beginnen (bei einem Vergleich ohne Berücksichtigung der Groß- und Kleinschreibung), und gehen Sie wie folgt vor. 

1.  Wandeln Sie jeden HTTP-Headernamen in Kleinbuchstaben um. Beispielsweise wird '`X-Amz-Date`' zu '`x-amz-date`'. 

1.  Sortieren Sie die Header alphabetisch nach dem Headernamen. 

1.  Kombinieren Sie Header-Felder mit demselben Namen zu einem „header-name:comma-separated-value-list“-Paar, wie von RFC 2616 Abschnitt 4.2 vorgegeben, ohne Leerzeichen zwischen den Werten. Die beiden Metadaten-Header '`x-amz-meta-username: fred`' und '`x-amz-meta-username: barney`' würden beispielsweise zu einem einzigen Header '`x-amz-meta-username: fred,barney`' zusammengefasst. 

1.  „Falten“ Sie lange Header „auf“, die sich über mehrere Zeilen erstrecken (wie durch RFC 2616 Abschnitt 4.2 erlaubt), indem Sie die „faltenden“ Leerzeichen (einschließlich Neue-Zeile-Zeichen) durch ein einzelnes Leerzeichen ersetzen. 

1.  Löschen Sie alle Leerzeichen um den Doppelpunkt in der Kopfzeile. Zum Beispiel würde der Header '' zu '`x-amz-meta-username: fred,barney`' werden. `x-amz-meta-username:fred,barney` 

1.  Schließlich fügen Sie jedem kanonisierten Header in der Ergebnisliste ein Neue-Zeile-Zeichen (`U+000A`) hinzu. Konstruieren Sie das CanonicalizedResource Element, indem Sie alle Header in dieser Liste zu einer einzigen Zeichenfolge verketten. 

## Positionelle und benannte HTTP-Header-Elemente StringToSign
<a name="RESTAuthenticationStringToSign"></a>

 Die ersten Header-Elemente von `StringToSign` (Content-Type, Date und Content-MD5) sind positioneller Natur. `StringToSign`enthält nicht die Namen dieser Header, sondern nur ihre Werte aus der Anfrage. Im Gegensatz dazu sind die '`x-amz-`'-Elemente benannt. Sowohl die Header-Namen als auch die Header-Werte erscheinen in `StringToSign`. 

 Wenn ein positionaler Header, der in der Definition von `StringToSign` vorgegeben ist, in Ihrer Anforderung nicht vorhanden ist (z. B. sind `Content-Type` oder `Content-MD5` optionale für PUT-Anforderungen und sinnlos für GET-Anforderungen), setzen Sie in dieser Position die leere Zeichenfolge ("") ein. 

## Zeitstempel-Anforderung
<a name="RESTAuthenticationTimeStamp"></a>

Ein gültiger Zeitstempel (unter Verwendung des HTTP-Headers `Date` oder einer `x-amz-date`-Alternative) ist zwingend erforderlich für authentifizierte Anforderungen. Darüber hinaus muss der Client-Zeitstempel in einer authentifizierten Anfrage innerhalb eines Zeitraums von 15 Minuten zur Amazon-S3-Systemzeit liegen, wenn die Anfrage empfangen wird. Wenn dies nicht der Fall ist, schlägt die Anforderung mit `RequestTimeTooSkewed`-Fehlercode fehl. Diese Einschränkungen sollen verhindern, dass abgefangene Anforderungen böswillig wiederholt werden. Für einen strengeren Schutz gegen ein Abhören transportieren Sie authentifizierte Anforderung mit HTTPS. 

**Anmerkung**  
Die Auswertungsbeschränkung im Hinblick auf das Anforderungsdatum gilt nur für authentifizierte Anforderungen, die keine Abfrage-String-Authentifizierung verwenden. Weitere Informationen finden Sie unter [Alternative zur Authentifizierung der Abfragezeichenfolge](#RESTAuthenticationQueryStringAuth).

Einige HTTP-Client-Bibliotheken unterstützen die Möglichkeit nicht, den `Date`-Header für eine Anforderung einzurichten. Wenn Sie Probleme damit haben, den Wert des 'Date'-Headers in kanonisierte Header aufzunehmen, können Sie den Zeitstempel für die Anforderung stattdessen auch mit einem '`x-amz-date`'-Header einrichten. Der Wert des `x-amz-date`-Headers muss in einem der von RFC 2616 vorgegebenen Formate vorliegen ([http://www.ietf.org/rfc/rfc2616.txt](http://www.ietf.org/rfc/rfc2616.txt)). Wenn in einer Anforderung ein `x-amz-date`-Header vorhanden ist, ignoriert das System bei der Berechnung der Anforderungssignatur jeden `Date`-Header. Wenn Sie also den `x-amz-date`-Header aufnehmen, verwenden Sie die leere Zeichenfolge für `Date`, wenn Sie den `StringToSign` erstellen. Ein Beispiel finden Sie im nächsten Abschnitt. 

## Authentifizierungsbeispiele
<a name="RESTAuthenticationExamples"></a>

 Die Beispiele in diesem Abschnitt verwenden die (nicht funktionierenden) Anmeldeinformationen aus der folgenden Tabelle. 


| Parameter | Wert | 
| --- | --- | 
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE | 
| AWSSecretAccessKey | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY | 

In den `StringToSign`s des Beispiels ist die Formatierung nicht relevant, und `\n` steht für den Unicode-Punkt `U+000A`, allgemein als Neue-Zeile-Zeichen bezeichnet. Außerdem verwenden die Beispiele "\+0000", um die Zeitzone anzugeben. Sie können die Zeitzone stattdessen mit "GMT" angeben, aber in den Beispielen werden andere Signaturen verwendet.

### Object GET
<a name="RESTAuthenticationExamples-1"></a>

In diesem Beispiel wird ein Objekt aus dem Bucket „awsexamplebucket1“ abgerufen.


| Anforderung | StringToSign | 
| --- | --- | 
|  <pre>GET /photos/puppy.jpg HTTP/1.1<br />Host: awsexamplebucket1.us-west-1.s3.amazonaws.com<br />Date: Tue, 27 Mar 2007 19:36:42 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />qgk2+6Sv9/oM7G3qLEjTH1a1l1g=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Tue, 27 Mar 2007 19:36:42 +0000\n<br />/awsexamplebucket1/photos/puppy.jpg</pre>  | 

 Beachten Sie, dass der den Bucket-Namen CanonicalizedResource enthält, HTTP jedoch Request-URI nicht. (Der Bucket wird vom Host-Header spezifiziert.) 

**Anmerkung**  
Das folgende Python-Skript berechnet die vorhergehende Signatur unter Verwendung der bereitgestellten Parameter. Sie können dieses Skript verwenden, um Ihre eigenen Signaturen zu erstellen und gegebenenfalls die Schlüssel StringToSign zu ersetzen.  

```
 1. import base64
 2. import hmac
 3. from hashlib import sha1
 4. 
 5. access_key = '{{AKIAIOSFODNN7EXAMPLE}}'.encode("UTF-8")
 6. secret_key = '{{wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY}}'.encode("UTF-8")
 7. 
 8. string_to_sign = '{{GET\n\n\nTue, 27 Mar 2007 19:36:42 +0000\n/awsexamplebucket1/photos/puppy.jpg}}'.encode("UTF-8")
 9. signature = base64.b64encode(
10.                                 hmac.new(
11.                                          secret_key, string_to_sign, sha1
12.                                          ).digest()
13.                                 ).strip()
14. 
15. 
16. print(f"AWS {access_key.decode()}:{signature.decode()}")
```

### Object PUT
<a name="RESTAuthenticationExamples-2"></a>

In diesem Beispiel wird ein Objekt in den Bucket „awsexamplebucket1“ eingefügt.


| Anforderung | StringToSign | 
| --- | --- | 
|  <pre>PUT /photos/puppy.jpg HTTP/1.1<br />Content-Type: image/jpeg<br />Content-Length: 94328<br />Host: awsexamplebucket1.s3.us-west-1.amazonaws.com<br />Date: Tue, 27 Mar 2007 21:15:45 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />iqRzw+ileNPu1fhspnRs8nOjjIA=<br />}}</pre>  |  <pre>PUT\n<br />\n<br />image/jpeg\n<br />Tue, 27 Mar 2007 21:15:45 +0000\n<br />/awsexamplebucket1/photos/puppy.jpg</pre>  | 

 Notieren Sie sich den Content-Type Header in der Anfrage und in der StringToSign. Beachten Sie auch, dass das in der leer gelassen Content-MD5 wird StringToSign, da es in der Anfrage nicht vorhanden ist. 

### Auflisten
<a name="RESTAuthenticationExamples-3"></a>



In diesem Beispiel wird der Inhalt des Buckets „awsexamplebucket1“ aufgelistet.


| Anforderung | StringToSign | 
| --- | --- | 
|  <pre>GET /?prefix=photos&max-keys=50&marker=puppy HTTP/1.1<br />User-Agent: Mozilla/5.0<br />Host: awsexamplebucket1.s3.us-west-1.amazonaws.com<br />Date: Tue, 27 Mar 2007 19:42:41 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />m0WP8eCtspQl5Ahe6L1SozdX9YA=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Tue, 27 Mar 2007 19:42:41 +0000\n<br />/awsexamplebucket1/</pre>  | 

 Beachten Sie den abschließenden Schrägstrich bei CanonicalizedResource und das Fehlen von Abfragezeichenfolgenparametern. 

### Fetch
<a name="RESTAuthenticationExamples-4"></a>

In diesem Beispiel wird die Zugriffskontrollrichtlinien-Subressource für den Bucket „awsexamplebucket1“ abgerufen.


| Anforderung | StringToSign | 
| --- | --- | 
|  <pre>GET /?acl HTTP/1.1<br />Host: awsexamplebucket1.s3.us-west-1.amazonaws.com<br />Date: Tue, 27 Mar 2007 19:44:46 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />82ZHiFIjc+WbcwFKGUVEQspPn+0=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Tue, 27 Mar 2007 19:44:46 +0000\n<br />/awsexamplebucket1/?acl</pre>  | 

 Beachten Sie, dass der Parameter für die Subresource-Abfragezeichenfolge in der enthalten ist. CanonicalizedResource 

### Delete
<a name="RESTAuthenticationExamples-5"></a>

In diesem Beispiel wird ein Objekt über die path-style- und Date-Alternative aus dem Bucket „awsexamplebucket1“ entfernt.


| Anforderung | StringToSign | 
| --- | --- | 
|  <pre>DELETE /awsexamplebucket1/photos/puppy.jpg HTTP/1.1<br />User-Agent: dotnet<br />Host: s3.us-west-1.amazonaws.com<br />Date: Tue, 27 Mar 2007 21:20:27 +0000<br /><br />x-amz-date: Tue, 27 Mar 2007 21:20:26 +0000<br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:XbyTlbQdu9Xw5o8P4iMwPktxQd8=}}</pre>  |  <pre>DELETE\n<br />\n<br />\n<br />Tue, 27 Mar 2007 21:20:26 +0000\n<br />/awsexamplebucket1/photos/puppy.jpg</pre>  | 

 Beachten Sie die alternative Methode „x-amz-date“ zur Angabe des Datums (weil unsere Client-Bibliothek uns beispielsweise daran gehindert hat, das Datum festzulegen). In diesem Fall hat `x-amz-date` Vorrang vor dem `Date`-Header. Aus diesem Grund muss der Datumseintrag in der Signatur den Wert des `x-amz-date`-Headers enthalten. 

### Hochladen
<a name="RESTAuthenticationExamples-6"></a>

Dieses Beispiel lädt ein Objekt in einen virtuell gehosteten Bucket mit CNAME-Stil mit Metadaten.


| Anforderung | StringToSign | 
| --- | --- | 
|  <pre>PUT /db-backup.dat.gz HTTP/1.1<br />User-Agent: curl/7.15.5<br />Host: static.example.com:8080<br />Date: Tue, 27 Mar 2007 21:06:08 +0000<br /><br />x-amz-acl: public-read<br />content-type: application/x-download<br />Content-MD5: 4gJE4saaMU4BqNR0kLY+lw==<br />X-Amz-Meta-ReviewedBy: joe@example.com<br />X-Amz-Meta-ReviewedBy: jane@example.com<br />X-Amz-Meta-FileChecksum: 0x02661779<br />X-Amz-Meta-ChecksumAlgorithm: crc32<br />Content-Disposition: attachment; filename=database.dat<br />Content-Encoding: gzip<br />Content-Length: 5913339<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />jtBQa0Aq+DkULFI8qrpwIjGEx0E=}}</pre>  |  <pre>PUT\n<br />4gJE4saaMU4BqNR0kLY+lw==\n<br />application/x-download\n<br />Tue, 27 Mar 2007 21:06:08 +0000\n<br /><br />x-amz-acl:public-read\n<br />x-amz-meta-checksumalgorithm:crc32\n<br />x-amz-meta-filechecksum:0x02661779\n<br />x-amz-meta-reviewedby:<br />joe@example.com,jane@example.com\n<br />/static.example.com/db-backup.dat.gz</pre>  | 

 Beachten Sie, wie die „x-amz-“-Header sortiert, von Leerzeichen befreit und in Kleinbuchstaben umgewandelt wurden. Beachten Sie außerdem, dass mehrere Header mit demselben Namen unter Verwendung von Kommas zum Trennen der Werte verknüpft wurden. 

 Beachten Sie, wie nur die HTTP-Header `Content-Type` und `Content-MD5` in `StringToSign` erscheinen. Die anderen `Content-*`-Header erscheinen nicht. 

 Beachten Sie auch hier, dass der den Bucket-Namen `CanonicalizedResource` enthält, HTTP Request-URI jedoch nicht. (Der Bucket wird vom Host-Header spezifiziert.) 

### Auflisten aller meiner Buckets
<a name="RESTAuthenticationExamples-7"></a>


| Anforderung | StringToSign | 
| --- | --- | 
|  <pre>GET / HTTP/1.1<br />Host: s3.us-west-1.amazonaws.com<br />Date: Wed, 28 Mar 2007 01:29:59 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:qGdzdERIC03wnaRNKh6OqZehG9s=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Wed, 28 Mar 2007 01:29:59 +0000\n<br />/</pre>  | 

### Unicode-Schlüssel
<a name="RESTAuthenticationExamples-8"></a>


| Anforderung | StringToSign | 
| --- | --- | 
|  <pre>GET /dictionary/fran%C3%A7ais/pr%c3%a9f%c3%a8re HTTP/1.1<br />Host: s3.us-west-1.amazonaws.com<br />Date: Wed, 28 Mar 2007 01:49:49 +0000<br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:DNEZGsoieTZ92F3bUfSPQcbGmlM=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Wed, 28 Mar 2007 01:49:49 +0000\n<br />/dictionary/fran%C3%A7ais/pr%c3%a9f%c3%a8re</pre>  | 

**Anmerkung**  
Die Elemente`StringToSign`, die aus dem abgeleitet wurden, Request-URI werden wörtlich genommen, einschließlich URL-Encoding und Großschreibung. 

## Probleme mit dem Signieren von REST-Anforderungen
<a name="RESTAuthenticationDebugging"></a>

 Wenn die Authentifizierung einer REST-Anforderung fehlschlägt, reagiert das System mit einem XML-Fehlerdokument auf die Anforderung. Die in diesem Fehlerdokument enthaltene Information soll Entwicklern helfen, das Problem zu diagnostizieren. Insbesondere erkennen Sie an dem `StringToSign`-Element des `SignatureDoesNotMatch`-Fehlerdokuments genau, welche Anforderungs-Kanonisierung das System verwendet. 

Einige Toolkits fügen stillschweigend Header ein, die Sie zuvor nicht kennen, wie beispielsweise den Header `Content-Type` bei einem PUT. In den meisten dieser Fälle bleibt der Wert des eingefügten Headers konstant, sodass Sie fehlende Header unter Verwendung von Tools wie Ethereal oder tcpmon erkennen können. 

## Alternative zur Authentifizierung der Abfragezeichenfolge
<a name="RESTAuthenticationQueryStringAuth"></a>

Einige Anforderungstypen können Sie authentifizieren, indem Sie die angeforderten Informationen als Abfragezeichenfolgenparameter übergeben, statt den HTTP-Header `Authorization` zu verwenden. Dies ist praktisch, um direkten Zugriff durch einen Browser von Dritten auf Ihre privaten Amazon-S3-Daten zu ermöglichen, ohne dass die Anfrage über einen Proxy gesendet wird. Die Idee besteht in der Konstruierung einer „vorsignierten“ Anforderung und ihrer Codierung als einer URL, die vom Browser eines Endbenutzers geladen werden kann. Darüber hinaus können Sie eine vorsignierte Anforderung durch die Angabe einer Ablaufzeit begrenzen. 

Weitere Informationen zur Verwendung von Abfrageparametern zur Authentifizierung von Anfragen finden Sie unter [ Authentifizieren von Anfragen: Verwenden von Abfrageparametern (AWS Signature Version 4) ](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html) in der * Amazon Simple Storage Service API-Referenz. * Beispiele für die Verwendung der AWS SDKs zum Generieren vorsignierter URLs finden Sie unter Objekte mit vorsignierten URLs [ teilen. ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html) 

### Erstellen einer Signatur
<a name="CreatingASignature"></a>

Das folgende Beispiel zeigt eine mit Abfragezeichenfolge authentifizierte Amazon-S3-REST-Anfrage.

```
1. GET /photos/puppy.jpg
2. ?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D HTTP/1.1
3. Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
4. Date: Mon, 26 Mar 2007 19:37:58 +0000
```

Die Authentifizierungsmethode für die Abfragezeichenkette benötigt keine spezifischen HTTP-Header. Stattdessen werden die erforderlichen Authentifizierungselemente als Abfragezeichenfolgenparameter angegeben: 


| Abfragezeichenfolgen-Parametername | Beispielwert | Description | 
| --- | --- | --- | 
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE | Ihre AWS Zugangsschlüssel-ID. Gibt den AWS geheimen Zugriffsschlüssel an, der zum Signieren der Anfrage verwendet wurde, und indirekt die Identität des Entwicklers, der die Anfrage stellt. | 
| Expires | 1141889120 | Die Zeit, wann die Signatur abläuft, angegeben als die Anzahl der Sekunden, die seit dem 1. Januar 1970 00:00:00 UTC verstrichen sind. Eine Anforderung, die nach dieser Zeit empfangen wird (abhängig vom Server), wird abgelehnt.  | 
| Signature | vjbyPxybdZaNmGa%2ByT272YEAiv4%3D | Die URL-Kodierung der Base64-Kodierung von HMAC-SHA1 von StringToSign. | 

Die Methode zur Authentifizierung der Abfragezeichenfolge unterscheidet sich leicht von der üblichen Methode, aber nur im Format des `Signature`-Anforderungsparameters und des `StringToSign`-Elements. Die folgende Pseudogrammatik verdeutlicht die Authentifizierungsmethode für die Abfragezeichenfolge. 

```
1. Signature = URL-Encode( Base64( HMAC-SHA1( YourSecretAccessKey, UTF-8-Encoding-Of( StringToSign ) ) ) );
2. 
3. StringToSign = HTTP-VERB + "\n" +
4.     Content-MD5 + "\n" +
5.     Content-Type + "\n" +
6.     Expires + "\n" +
7.     CanonicalizedAmzHeaders +
8.     CanonicalizedResource;
```

`YourSecretAccessKey`ist die AWS geheime Zugriffsschlüssel-ID, die Amazon Ihnen zuweist, wenn Sie sich als Amazon Web Service-Entwickler registrieren. Beachten Sie URL-Encoded , wie `Signature` das für die Platzierung in der Abfragezeichenfolge geeignet ist. Beachten Sie auch, dass in `StringToSign` das HTTP-Positionselement `Date` durch `Expires` ersetzt wurde. `CanonicalizedAmzHeaders` und `CanonicalizedResource` sind gleich. 

**Anmerkung**  
In der Methode für die Abfrage-String-Authentifizierung verwenden Sie den Header `Date` oder `x-amz-date request` nicht, wenn Sie die zu signierende Zeichenfolge berechnen.

#### Authentifizierung von Abfragezeichenfolgen-Anforderungen
<a name="query-str-auth-ex"></a>


| Anforderung | StringToSign | 
| --- | --- | 
|  <pre>GET /photos/puppy.jpg?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&<br />    Signature=NpgCjnDzrM%2BWFzoENXmpNDUsSn8%3D&<br />    Expires=1175139620 HTTP/1.1<br /><br />Host: awsexamplebucket1.s3.us-west-1.amazonaws.com</pre>  |  <pre>GET\n<br />\n<br />\n<br />1175139620\n<br /><br />/awsexamplebucket1/photos/puppy.jpg</pre>  | 

In diesem Beispiel wird davon ausgegangen, dass ein Browser, wenn er die GET-Anfrage stellt, weder einen Content-MD5 oder Content-Type -Header bereitstellt, noch irgendwelche x-amz-Header setzt, sodass diese Teile von leer `StringToSign` bleiben. 

#### Verwendung der Base64-Codierung
<a name="S3_Authentication_Base64"></a>

Signaturen von HMAC-Anforderungen müssen mit Base64 codiert werden. Die Base64-Codierung wandelt die Signatur in einen einfachen ASCII-String um, der der Anforderung hinzugefügt werden kann. Zeichen, die in der Signatur erscheinen können, wie beispielsweise Plus (\+), Schrägstrich (/) oder Gleichheitszeichen (=), müssen wie in einer URI codiert werden. Enthält beispielsweise der Authentifizierungscode ein Plussymbol (\+), codieren Sie es in der Anforderung als &2B. Einen Schrägstrich codieren Sie als &2F, ein Gleichheitszeichen als %3D.

Beispiele für die Base64-Codierung finden Sie in Amazon S3 [Authentifizierungsbeispiele](#RESTAuthenticationExamples).