Menü
Amazon Web Services
Allgemeine Referenz (Version 1.0)

Signaturprozess mit Signature Version 2

Sie können Signature Version 2 verwenden, um API-Anforderungen zu signieren. Allerdings empfehlen wir, Ihre Anforderung mit Signaturversion 4 zu signieren. Weitere Informationen finden Sie unter Signaturprozess mit Signaturversion 4.

Unterstützte Regionen und Services

Die folgenden Regionen unterstützen Signature Version 2 nicht. Sie müssen Signaturversion 4 verwenden, um in diesen Regionen API-Anforderungen zu signieren:

  • Region USA Ost (Ohio)

  • Region Kanada (Zentral)

  • Region Asien-Pazifik (Mumbai)

  • Region Asien-Pazifik (Seoul)

  • Region EU (Frankfurt)

  • Region EU (London)

  • Region China (Peking)

Die folgenden Services unterstützen Signature Version 2 in allen anderen Regionen.

AWS-Services, die Signature Version 2 unterstützen

Auto Scaling

Auto Scaling-API-Referenz

AWS CloudFormation

AWS CloudFormation API Reference

Amazon CloudWatch

Amazon CloudWatch API Reference

AWS Elastic Beanstalk

AWS Elastic Beanstalk API Reference

Amazon Elastic Compute Cloud (Amazon EC2)

Amazon EC2 API Reference

Elastic Load Balancing

Elastic Load Balancing API Reference version 2012-06-01

Amazon EMR

Amazon EMR API Reference

Amazon ElastiCache

Amazon ElastiCache API Reference

AWS Identity and Access Management (IAM)

IAM API Reference

AWS Import/Export

AWS Import/Export API Reference

Amazon Relational Database Service (Amazon RDS

Amazon Relational Database Service API Reference

Amazon Simple Notification Service (Amazon SNS)

Amazon Simple Notification Service API Reference

Amazon Simple Queue Service (Amazon SQS)

Amazon Simple Queue Service API Reference

Amazon SimpleDB

Amazon SimpleDB-API-Referenz

Komponenten einer Abfrageanforderung für Signature Version 2

AWS erfordert, dass jede HTTP- oder HTTPS-Abfrageanforderung, die für Signature Version 2 formatiert ist, Folgendes enthält:

Endpunkt

Dies ist der Host-Teil einer HTTP-Anforderung. Dies ist der DNS-Name des Computers, auf dem Sie die Abfrageanforderung senden. Dieser unterscheidet sich für jede AWS-Region. Eine Liste der Endpunkte für die einzelnen Services finden Sie unter Regionen und Endpunkte von AWS.

Action

Die Aktion, die ein Webservice ausführen soll. Dieser Wert bestimmt die Parameter in der Anforderung.

AWSAccessKeyId

Ein Wert, der von AWS verteilt wird, wenn Sie sich für ein AWS-Konto anmelden.

SignatureMethod

Das Hash-basierte Protokoll, das verwendet wird, um die Signatur zu berechnen. Dies kann entweder HMAC-SHA1 oder HMAC-SHA256 für Signature Version 2 sein.

SignatureVersion

Die Version des AWS-Signaturprotokolls.

Zeitstempel

Die Uhrzeit, zu der Sie die Anforderung senden. Fügen Sie dies der Abfrageanforderung hinzu, damit Ihre Anforderung nicht von Dritten abgefangen werden kann.

Erforderliche und optionale Parameter

Jede Aktion umfasst obligatorische und optionale Parameter zur Definition des API-Aufrufs.

Signature

Der berechnete Wert, der sicherstellt, dass die Signatur gültig ist und nicht manipuliert wurde.

Im Folgenden finden Sie ein Beispiel für eine Amazon EMR-Abfrageanforderung, die als HTTPS-GET-Anforderung formatiert ist.

  • Der Endpunkt elasticmapreduce.amazonaws.com ist der Standardendpunkt und ist der Region "us-east-1" zugeordnet.

  • Die Aktion ist DescribeJobFlows, die Informationen über einen oder mehrere Auftragsverläufe anfordert.

Anmerkung

In der tatsächlichen Abfrageanforderung gibt es keine Leer- oder Zeilenumbruchszeichen. Die Anforderung ist eine durchgehende Textzeile. Die Version unten ist für eine bessere Lesbarkeit formatiert.

Copy
https://elasticmapreduce.amazonaws.com? &AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE &Action=DescribeJobFlows &SignatureMethod=HmacSHA256 &SignatureVersion=2 &Timestamp=2011-10-03T15%3A19%3A30 &Version=2009-03-31 &Signature=calculated value

Erstellen einer Signatur der Version 2 für eine Abfrageanforderung

Webservice-Anforderungen werden über das Internet versendet und können daher leicht manipuliert werden. Um zu überprüfen, dass die Anforderung nicht geändert wurde, berechnet AWS die Signatur, um so festzustellen, ob einer der Parameter oder Parameterwerte unterwegs geändert wurde. AWS erfordert eine Signatur als Bestandteil jeder Anforderung.

Anmerkung

Stellen Sie sicher, dass die Anforderung URI-kodiert ist. Leerzeichen in Ihrer Anforderungen sollten beispielsweise als %20 kodiert sein. Auch wenn ein nicht kodiertes Leerzeichen generell von der HTTP-Protokollspezifikation zugelassen wird, erzeugen unkodierte Zeichen eine ungültige Signatur in Ihrer Abfrageanforderung. Verschlüsseln Sie Leerzeichen nicht als Pluszeichen (+), da dies zu Fehlern führt.

In den folgenden Themen werden die erforderlichen Schritte zur Berechnung einer Signatur mithilfe von AWS Signatur Version 2 beschrieben.

Aufgabe 1: Formatieren der Abfrageanforderung

Bevor Sie die Abfrageanforderung signieren können, formatieren Sie die Anforderung in einem standardisierten (kanonischen) Format. Dies ist notwendig, da die verschiedenen Möglichkeiten zur Formatierung einer Abfrageanforderung sonst in unterschiedlichen HMAC-Signaturen resultieren. Formatieren Sie die Anforderung vor der Signierung in einem kanonischen Format. So wird sichergestellt, dass Ihre Anwendung und AWS die gleiche Signatur für eine Anforderung berechnen.

Um die zu signierende Zeichenfolge zu erstellen, verketten Sie die Bestandteile der Abfrageanforderung. Das folgende Beispiel generiert die zu signierende Zeichenfolge für den folgenden Aufruf zur Amazon EMR-API.

Copy
https://elasticmapreduce.amazonaws.com? Action=DescribeJobFlows &Version=2009-03-31 &AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2011-10-03T15:19:30

Anmerkung

In der vorherigen Anforderung werden die letzten vier Parameter (AWSAccessKeyID bis Zeitstempel) als Authentifizierungsparameter bezeichnet. Sie sind in jeder Signature Version 2-Anforderung erforderlich. Sie werden von AWS verwendet, um den Absender der Anforderung zu identifizieren und um zu entscheiden, ob der angeforderte Zugriff gewährt wird.

So erstellen Sie die zu signierende Zeichenfolge (Signature Version 2)

  1. Beginnen Sie mit der Anforderungsmethode (GET oder POST), gefolgt von einem Zeilenumbruchzeichen. Für bessere Lesbarkeit wird das Zeilenumbruchzeichen als \n dargestellt.

    Copy
    GET\n
  2. Fügen Sie den HTTP-Host-Header (Endpunkt) in Kleinbuchstaben hinzu, gefolgt von einem Zeilenumbruchzeichen. Die Port-Informationen werden ausgelassen, wenn dies der Standard-Port für das Protokoll ist (Port 80 für HTTP und Port 443 für HTTPS), andernfalls aber hinzugefügt.

    Copy
    elasticmapreduce.amazonaws.com\n
  3. Fügen Sie die URL-kodierte Version jedes Pfadsegments des URI hinzu. Dies ist alles zwischen dem HTTP-Host-Header bis zum Fragezeichen (?), mit dem die Abfragezeichenfolgenparameter beginnen, gefolgt von einem Zeilenumbruchzeichen. Kodieren Sie nicht den Schrägstrich (/), der die einzelnen Pfadsegmente trennt.

    Wenn in diesem Beispiel der absolute Pfad leer ist, verwenden Sie einen Schrägstrich (/).

    Copy
    /\n
    1. Fügen Sie die Bestandteile der Abfragezeichenfolge als UTF-8-Zeichen in URL-Kodierung hinzu (Hexadezimalzeichen müssen Großbuchstaben sein). Sie kodieren nicht das erste Fragezeichen (?) in der Anforderung. Weitere Informationen finden Sie unter RFC 3986.

    2. Sortieren Sie die Komponenten der Abfragezeichenfolge in Bytereihenfolge. Bei der Bytereihenfolge wird zwischen Groß- und Kleinschreibung unterschieden. AWS sortiert diese Komponenten basierend auf den Rohbytes.

      Dies ist beispielsweise die ursprüngliche Reihenfolge der Komponenten der Abfragezeichenfolge.

      Copy
      Action=DescribeJobFlows Version=2009-03-31 AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE SignatureVersion=2 SignatureMethod=HmacSHA256 Timestamp=2011-10-03T15%3A19%3A30

      Die Komponenten der Abfragezeichenfolge würden wie folgt neu organisiert:

      Copy
      AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE Action=DescribeJobFlows SignatureMethod=HmacSHA256 SignatureVersion=2 Timestamp=2011-10-03T15%3A19%3A30 Version=2009-03-31
    3. Separate Parameternamen von ihren Werten mit dem Gleichheitszeichen (=), selbst wenn der Wert leer ist. Separate Parameter- und Wert-Paare mit einem kaufmännischen Und-Zeichen (&). Verketten Sie die Parameter und ihre Werte zu einer langen Zeichenfolge ohne Leerzeichen. Leerzeichen innerhalb eines Parameterwerts sind zwar zulässig, müssen aber URL-kodiert sein wie %20. In der verketteten Zeichenfolge werden Punktzeichen (.) nicht durch Escape-Zeichen geschützt. RFC 3986 betrachtet das Punktzeichen als nicht reserviertes Zeichen, folglich ist es nicht URL-kodiert.

      Anmerkung

      RFC 3986 gibt nicht an, was mit ASCII-Steuerzeichen, erweiterten UTF-8-Zeichen und anderen Zeichen passiert, die von RFC 1738 reserviert sind. Da alle Werte in einen Zeichenfolgenwert übergeben werden können, sollten diese Zeichen mit dem Prozentzeichen als %XY kodiert werden, wobei X und Y Hexadezimalzeichen in Großbuchstaben sind. Erweiterte UTF-8-Zeichen werden als %XY%ZA... formatiert (zur Handhabung von Mehrbyte-Zeichen).

    Das folgende Beispiel zeigt die Komponenten der Abfragezeichenfolge, deren Parameter mit dem kaufmännischen Und-Zeichen (&) verkettet und in Bytereihenfolge sortiert sind.

    Copy
    AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-3
  4. Um die kanonische Anforderung fertigzustellen, verbinden Sie alle Komponenten von jedem Schritt. Wie gezeigt endet jede Komponente mit einem Zeilenumbruchzeichen.

    Copy
    GET\n elasticmapreduce.amazonaws.com\n /\n AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31

Aufgabe 2: Berechnen der Signatur

Nachdem Sie die kanonische Zeichenfolge wie in Aufgabe 1: Formatieren der Abfrageanforderung beschrieben erstellt haben, berechnen Sie die Signatur, indem Sie einen Hash-basierten Message Authentication Code (HMAC) erstellen, der das Protokoll HMAC-SHA1 oder HMAC-SHA256 verwendet. Das HMAC-SHA256-Protokoll wird bevorzugt.

In diesem Beispiel wird die Signatur mit der folgenden kanonischen Zeichenfolge und dem folgenden geheimen Schlüssel als Eingabewerte für eine Keyed-Hash-Funktion berechnet:

  • Kanonische Abfragezeichenfolge:

    Copy
    GET\n elasticmapreduce.amazonaws.com\n /\n AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31
  • Beispiel für geheimen Schlüssel:

    Copy
    wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

Die resultierende Signatur muss Basis-64-kodiert sein.

Copy
i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf%2FMj6vPxyYIs%3D

Fügen Sie den resultierenden Wert der Abfrageanforderung als Signature-Parameter hinzu. Wenn Sie der Anforderung diesen Parameter hinzufügen, müssen Sie ihn wie jeden anderen Parameter mit URI kodieren. Sie können die signierte Anforderung in einem HTTP- oder HTTPS-Aufruf verwenden.

Copy
https://elasticmapreduce.amazonaws.com?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Action=DescribeJobFlows&SignatureMethod=HmacSHA256&SignatureVersion=2&Timestamp=2011-10-03T15%3A19%3A30&Version=2009-03-31&Signature=i91nKc4PWAt0JJIdXwz9HxZCJDdiy6cf%2FMj6vPxyYIs%3D

Anmerkung

Sie können temporäre Sicherheitsanmeldeinformationen von der AWS Security Token Service (AWS STS) zum Signieren einer Anforderung verwenden. Der Prozess ist der gleiche wie bei der Verwendung dauerhaft gültiger Anmeldeinformationen, erfordert aber einen zusätzlichen Parameter für das Sicherheits-Token.

Bei der folgenden Anforderung werden eine temporäre Zugriffsschlüssel-ID und der SecurityToken Parameter verwendet.

Beispielanforderung mit temporären Sicherheitsanmeldeinformationen

Copy
https://sdb.amazonaws.com/ ?Action=GetAttributes &AWSAccessKeyId=access-key-from-AWS Security Token Service &DomainName=MyDomain &ItemName=MyItem &SignatureVersion=2 &SignatureMethod=HmacSHA256 &Timestamp=2010-01-25T15%3A03%3A07-07%3A00 &Version=2009-04-15 &Signature=signature-calculated-using-the-temporary-access-key &SecurityToken=session-token

Weitere Informationen finden Sie in den folgenden Ressourcen:

Fehlerbehebung bei Anforderungen mit Signature Version 2

In diesem Abschnitt werden einige Fehlermeldungen beschrieben, die möglicherweise angezeigt werden, wenn Sie anfänglich Code zur Generierung der Signatur zum Signieren von Abfrageanforderungen entwickeln.

SignatureDoesNotMatch-Signaturfehler in einem Webservice

Die folgende Fehlermeldung wird angezeigt, wenn ein Webservice versucht, die Signatur der Anforderung durch Neuberechnung des Signaturwerts zu validieren, und einen Wert generiert, der nicht mit der Signatur übereinstimmt, die Sie der Anforderung angefügt haben. Dies kann der Fall sein, wenn die Anforderung zwischen dem Zeitpunkt, an dem Sie sie versendet haben, und dem Zeitpunkt, an dem sie den Webservice-Endpunkt erreichte geändert wurde (was die Signatur erkennen sollte). Es ist auch möglich, dass die Signatur nicht korrekt berechnet wurde. Eine häufige Ursache für die folgende Fehlermeldung ist, dass die zu signierende Zeichenfolge nicht ordnungsgemäß erstellt wurde, z. B. wenn die URL-Kodierung der Zeichen vergessen wurde, etwa das Semikolon (;) und der Schrägstrich (/) in Amazon S3-Bucket-Namen.

Copy
<ErrorResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31"> <Error> <Type>Sender</Type> <Code>SignatureDoesNotMatch</Code> <Message>The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.</Message> </Error> <RequestId>7589637b-e4b0-11e0-95d9-639f87241c66</RequestId> </ErrorResponse>

IncompleteSignature-Signaturfehler in einem Webservice

Die folgende Fehlermeldung weist darauf hin, dass für die Signatur Informationen fehlen oder sie falsch erstellt wurde.

Copy
<ErrorResponse xmlns="http://elasticmapreduce.amazonaws.com/doc/2009-03-31"> <Error> <Type>Sender</Type> <Code>IncompleteSignature</Code> <Message>Request must contain a signature that conforms to AWS standards</Message> </Error> <RequestId>7146d0dd-e48e-11e0-a276-bd10ea0cbb74</RequestId> </ErrorResponse>

Verwenden des Java SDK zur Signierung einer Abfrageanforderung

Im folgenden Beispiel wird das Paket "amazon.webservices.common" des AWS SDK für Java verwendet, um eine Signatur für eine Abfrageanforderung mit Signature Version 2 zu generieren. Dazu wird eine RFC 2104-kompatible HMAC-Signatur erstellt. Weitere Informationen zu HMAC finden Sie unter HMAC: Keyed-Hashing für die Nachrichtenauthentifizierung.

Anmerkung

Java wird als Beispielimplementierung verwendet. Sie können eine Programmiersprache Ihrer Wahl verwenden, um den HMAC-Algorithmus zur Signierung von Abfrageanforderungen zu implementieren.

Copy
import java.security.SignatureException; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import com.amazonaws.util.*; /** * This class defines common routines for generating * authentication signatures for AWS Platform requests. */ public class Signature { private static final String HMAC_SHA256_ALGORITHM = "HmacSHA256"; /** * Computes RFC 2104-compliant HMAC signature. * * @param data * The signed data. * @param key * The signing key. * @return * The Base64-encoded RFC 2104-compliant HMAC signature. * @throws * java.security.SignatureException when signature generation fails */ public static String calculateRFC2104HMAC(String data, String key) throws java.security.SignatureException { String result; try { // Get an hmac_sha256 key from the raw key bytes. SecretKeySpec signingKey = new SecretKeySpec(key.getBytes("UTF8"), HMAC_SHA256_ALGORITHM); // Get an hmac_sha256 Mac instance and initialize with the signing key. Mac mac = Mac.getInstance(HMAC_SHA256_ALGORITHM); mac.init(signingKey); // Compute the hmac on input data bytes. byte[] rawHmac = mac.doFinal(data.getBytes("UTF8")); // Base64-encode the hmac by using the utility in the SDK result = BinaryUtils.toBase64(rawHmac); } catch (Exception e) { throw new SignatureException("Failed to generate HMAC : " + e.getMessage()); } return result; } }