Wie kann ich den Fehler „The security token included in the request is expired“ bei der Ausführung von Java-Anwendungen auf Amazon EC2 beheben?

Letzte Aktualisierung:04.03.2021

Meine Java-Anwendungen, die AWS SDK for Java auf einer Amazon Elastic Compute Cloud (Amazon EC2)-Instance verwenden, erhalten eine Ausnahme ähnlich der folgenden:

com.amazonaws.AmazonServiceException: Das in der Anforderung enthaltene Sicherheitstoken ist abgelaufen (Service: AmazonSQS; Statuscode: 403; Fehlercode: ExpiredToken; Anforderungs-ID: 12a345b6-78cd-901e-fg23-45hi67890jkl)

Wie kann ich dies beheben?

Kurzbeschreibung

Alle Anwendungs-API-Anfragen an Amazon Web Services (AWS) müssen kryptografisch mit von AWS ausgestellten Anmeldeinformationen signiert werden.

Wenn Ihre Anwendung beim Erstellen eines AWS-Clients temporäre Anmeldeinformationen verwendet, laufen die Anmeldeinformationen in dem bei ihrer Erstellung angegebenen Zeitintervall ab. Sie müssen die Anmeldeinformationen aktualisieren, bevor sie ablaufen.

Ein weiterer Grund für den Ablauf ist die Verwendung der falschen Zeit. Ein konsistenter und genauer Zeitverweis ist für viele Serveraufgaben und -prozesse entscheidend. Wenn Datum und Uhrzeit Ihrer Instance nicht richtig eingestellt sind, werden die AWS-Anmeldeinformationen abgelehnt.

Wenn Ihre Anwendung auf einer Amazon-EC2-Instance ausgeführt wird, ist es eine bewährte Methode, eine der Instance zugewiesene AWS Identity and Access Management (IAM)-Rolle zu verwenden. Die Verwendung einer IAM-Rolle erlaubt die Verwendung eines Standard-Servicekonstruktors. Der Standard-Konstruktor-Client sucht mithilfe der standardmäßigen Anbieterkette für Anmeldeinformationen in der folgenden Reihenfolge nach Anmeldeinformationen:

  1. In Systemumgebungs-Variablen: AWS_ACCESS_KEY_ID und AWS_SECRET_ACCESS_KEY.
  2. In den Java-Systemeigenschaften: aws.AccessKeyID und aws.SecretKey.
  3. In der Standard-Anmeldeinformations-Datei (der Speicherort dieser Datei variiert je nach Plattform).
  4. In den Instance-Profil-Anmeldeinformationen, die in den Instance-Metadaten enthalten sind, die der IAM-Rolle für die EC2-Instance zugeordnet sind. Durch das Anfügen eines Instance-Profils an Ihre Instance werden Instance-Profil-Anmeldeinformationen zur Standard-Anbieterkette für Anmeldeinformationen hinzugefügt. Weitere Informationen finden Sie unter Verwenden einer IAM-Rolle zum Erteilen von Berechtigungen für Anwendungen, die auf Amazon EC2-Instances ausgeführt werden.

Wenn Instance-Profil-Anmeldeinformationen verfügbar sind, erstellt der Standard-Clientkonstruktor eine Instance der AWS SDK InstanceProfileCredentialsProvider-Klasse. AWS verwendet diese Klasse, um API-Anfragen mit AWS-Anmeldeinformationen mithilfe temporärer Sicherheits-Anmeldeinformationen aus Amazon-EC2-Instance-Metadaten zu signieren.

Wichtig: Wenn Ihre Anwendung die AWS-SDK-Klasse ProfileCredentialsProvider verwendet, um temporäre AWS-Anmeldeinformationen bereitzustellen, sind Sie dafür verantwortlich, die Anmeldeinformationen zu überprüfen und zu aktualisieren, bevor sie ablaufen. Wenn Sie Ihre Anmeldeinformationen nicht überprüfen oder aktualisieren, erhöht sich die Wahrscheinlichkeit von Anwendungsfehlern, die durch ExpiredToken-Fehler verursacht werden.

Auflösung

Verwendung von Amazon Time Sync Service oder NTP-Quellen

Konfigurieren Sie den Amazon Time Sync Service oder eine andere Network Time Protocol (NTP)-Quelle auf Ihrer Amazon-EC2-Instance. Dadurch wird sichergestellt, dass Ihre Linux-Instance über einen konsistenten und genauen Zeitverweis verfügt. Weitere Informationen finden Sie unter Festlegen der Zeit für Ihre Linux-Instance oder Festlegen der Zeit für eine Windows-Instance.

Verwendung von benutzerdefinierten temporären AWS-Anmeldeinformationen

Aktualisieren Sie temporäre Anmeldeinformationen fünf Minuten vor ihrem Ablauf.

Verwenden Sie eine einer Instance zugewiesene IAM-Rolle

Fügen Sie ein Instance-Profil an Ihre Instance an. Weitere Informationen finden Sie unter Verwenden einer IAM-Rolle zum Erteilen von Berechtigungen für Anwendungen, die auf Amazon-EC2-Instances ausgeführt werden. Stellen Sie sicher, dass in Ihrem Code oder in der Instance keine anderen Anmeldeinformationen angegeben sind. Die Anmeldeinformationen des Instance-Profils sind der letzte Ort, an dem die Standard-Anmeldeinformations-Anbieterkette nach Anmeldeinformationen sucht. Wenn sich Anmeldeinformationen an einer früheren Stelle in der Suchkette befinden, verhindern diese Anmeldeinformationen die Verwendung von IAM. Weitere Informationen finden Sie unter Arbeiten mit AWS-Anmeldeinformationen.

Um die AWS-Anmeldeinformationen für eine IAM-Rolle anzuzeigen, die an eine Instance angefügt ist, führen Sie die folgenden Befehle von einer Linux-Shell oder von Windows PowerShell (v3.0 oder neuer) aus. Ersetzen Sie unbedingt examplerole durch den Namen Ihrer IAM-Rolle.

Linux

Verwenden Sie den Befehl curl, um AWS-Anmeldeinformationen anzuzeigen:

$ curl http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole

Dieser Befehl gibt eine Ausgabe ähnlich der folgenden zurück:

{
    "Code" : "Success",
    "LastUpdated" : "2016-04-26T16:39:16Z",
    "Type" : "AWS-HMAC",
    "AccessKeyId" : "AKIAIOSFODNN7EXAMPLE",
    "SecretAccessKey" : "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",
    "Token" : "token",
    "Expiration" : "2016-04-27T22:39:16Z"
}

Hinweis: Wenn die Ausführung des vorherigen curl-Befehls einen 404-Fehler zurückgibt, überprüfen Sie Folgendes:

1.    Verwenden Sie den folgenden Befehl, um zu überprüfen, ob der HTTP-Proxy für die Metadaten-IP-Adresse deaktiviert ist:

$ export NO_PROXY=169.254.169.254

2.    Stellen Sie sicher, dass die Instance nicht mehrere gleichzeitige Anfragen stellt und mehrere Sitzungen parallel ausführt. Mehrere gleichzeitige Anforderungen und mehrere parallel ausgeführte Sitzungen können eine Ablehnung durch den Instance Metadata Service (IMDS) verursachen. Um dies zu vermeiden, verwenden Sie Caching und Wiederholungen mit exponentiellem Backoff. Wie bei jedem Service können Aufrufe gelegentlich fehlschlagen. Von Kunden wird erwartet, dass sie es in diesem Fall erneut versuchen. Weitere Informationen finden Sie unter Abfragedrosselung.

Um Wiederholungen zu implementieren, ändern Sie AWS_METADATA_SERVICE_NUM_ATTEMPTS. Sie können Optionen mithilfe von Umgebungsvariablen, in der Datei ~/.aws/config oder in der Botocore-Sitzung des Benutzers festlegen. Weitere Informationen finden Sie unter Konfiguration in der Boto3-DOCS-1.17.6-Dokumentation.

Beispiel:

AWS_METADATA_SERVICE_TIMEOUT = 10
AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5

3.    Wenn Sie den Curl-Test in einem Docker-Container ausführen, passen Sie das instance-metadata-options http-put-response-hop-limit an:

$ aws ec2 modify-instance-metadata-options --instance-id $(curl 169.254.169.254/latest/meta-data/instance-id) --http-put-response-hop-limit 2 --http-endpoint enabled

Weitere Informationen finden Sie unter Hinzufügen eines umfassenden Schutzes gegen offene Firewalls, Reverse-Proxys und SSRF-Schwachstellen durch Verbesserungen des EC2-Instance-Metadaten-Dienstes.

4.    Stellen Sie sicher, dass das Instance-Profil ordnungsgemäß an die Instance angefügt ist.

Windows

Verwenden Sie den Befehl Invoke-RestMethod, um AWS-Anmeldeinformationen anzuzeigen:

PS C:\> Invoke-RestMethod http://169.254.169.254/latest/meta-data/iam/security-credentials/examplerole

Dieser Befehl gibt eine Ausgabe ähnlich der folgenden zurück:

Code            : Success
LastUpdated     : 2016-07-18T18:09:47Z
Type            : AWS-HMAC
AccessKeyId     : AKIAIOSFODNN7EXAMPLE
SecretAccessKey : wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Token           : token
Expiration      : 2016-04-27T22:39:16Z

Verwenden Sie diese Befehle, um die neuesten temporären Anmeldeinformationen für die Instance zu überprüfen. Diese Anmeldeinformationen werden automatisch ungefähr fünf Minuten vor Ablauf der zugewiesenen temporären Anmeldeinformationen rotiert oder aktualisiert.

Zugehörige Informationen

Arbeiten mit AWS-Anmeldeinformationen (AWS SDK for Java)

Verwenden von Anmeldeinformationen (AWS SDK for Java 2.0)

IAM-Rollen für Amazon EC2

Configuring IAM roles for Amazon EC2 (Advanced)


War dieser Artikel hilfreich?


Benötigen Sie Hilfe zur Fakturierung oder technischen Support?