在 Amazon EC2 上运行 Java 应用程序时,如何解决“The security token included in the request is expired”错误?

上次更新时间:2021 年 3 月 4 日

Amazon Elastic Compute Cloud (Amazon EC2) 实例上使用适用于 Java 的 AWS 开发工具包的 Java 应用程序接受到类似以下内容的异常:

com.amazonaws.AmazonServiceException: The security token included in the request is expired (Service: AmazonSQS; Status Code: 403; Error Code: ExpiredToken; Request ID: 12a345b6-78cd-901e-fg23-45hi67890jkl)

我如何解决此问题?

简短描述

必须使用 AWS 颁发的凭证对发送到 Amazon Web Services (AWS) 的所有应用程序 API 请求进行加密签名。

如果您的应用程序在创建 AWS 客户端时使用了临时凭证,则凭证在创建时指定的时间间隔后过期。您必须在凭证过期之前刷新凭证。

另一个过期原因是使用的时间不正确。对于许多服务器任务和进程来说,准确一致的时间参考非常重要。如果实例的日期和时间设置不正确,则 AWS 凭证会被拒绝。

如果您的应用程序运行在 Amazon EC2 实例上,最佳做法是使用分配给此实例的 AWS Identity and Access Management (IAM) 角色。使用 IAM 角色将允许使用默认服务构造函数。默认构造函数客户端按以下顺序使用默认凭证提供程序链搜索凭证:

系统环境变量:AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY。

Java 系统属性:aws.accessKeyId 和 aws.secretKey。

默认凭证文件(在不同平台上该文件位于不同位置)。

实例配置文件凭证:包含在与 EC2 实例的 IAM 角色关联的实例元数据中。通过将实例配置文件附加到您的实例,可将实例配置文件凭证添加到默认凭证提供程序链。有关更多信息,请参阅使用 IAM 角色向在 Amazon EC2 实例上运行的应用程序授予权限。

如果有实例配置文件凭证可用,则默认客户端构造函数会使用 AWS 开发工具包 InstanceProfileCredentialsProvider 类的一个实例。AWS 使用此类来通过 AWS 凭证签署 API 请求,使用的是来自 Amazon EC2 实例元数据的临时安全凭证。

重要说明:如果您的应用程序使用 AWS 开发工具包 ProfileCredentialsProvider 类提供临时 AWS 凭证,则由您负​责检查凭证并在过期前进行刷新。不检查或不刷新凭证会增加 ExpiredToken 错误引发应用程序故障的可能性。

解决方法

使用 Amazon Time Sync Service 或 NTP 源

在 Amazon EC2 实例上配置 Amazon Time Sync Service 或其他网络时间协议 (NTP) 源。这可以确保您的 Linux 实例具有一致且准确的时间参考。有关更多信息,请参阅设置 Linux 实例的时间或设置 Windows 实例的时间。

使用自定义临时 AWS 凭证

请在凭证过期前 5 分钟刷新临时凭证。

使用分配给实例的 IAM 角色

将实例配置文件附加到您的实例。有关更多信息,请参阅使用 IAM 角色向在 Amazon EC2 实例上运行的应用程序授予权限。验证未在您的代码或实例中指定其他凭证。实例配置文件凭证是默认凭证提供程序链搜索凭证的最后位置。如果您将凭证放置在搜索链中靠前的任何位置,则这些凭证将阻止使用 IAM。有关更多信息,请参阅使用 AWS 凭证。

要查看附加到实例的 IAM 角色的 AWS 凭证,请在 Linux shell 或 Windows PowerShell(v3.0 或更高版本)中运行以下命令。请务必将 examplerole替换为您的 IAM 角色的名称。

Linux

请使用 curl 命令查看 AWS 凭证:

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

此命令会返回类似以下内容的输出:

{

"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"

}

注意:如果运行前面的 curl 命令返回 404 错误,请检查以下事项:

$ export NO_PROXY=169.254.169.254

2.    验证该实例没有发出多个并发请求和并行运行多个会话。多个并发请求和多个并行运行的会话可能会导致实例元数据服务 (IMDS) 限制。为了缓解这种情况,请使用缓存和通过指数回退方式重试。与任何服务一样,调用偶尔可能会失败。发生这种情况时,客户端将重试。有关更多信息,请参阅查询限制。

要执行重试,请修改 AWS_METADATA_SERVICE_NUM_ATTEMPTS。您可以在 ~/.aws/config 文件或用户的 botocore 会话中使用环境变量来设置选项。有关更多信息,请参阅 Boto3 DOCS 1.17.6 文档中的配置。

示例:

AWS_METADATA_SERVICE_TIMEOUT = 10

AWS_METADATA_SERVICE_NUM_ATTEMPTS = 5

3.    如果你在 Docker 容器中运行 curl 测试,请调整 instance-metadata-options http-put-response-hop-limit:

$ 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

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

此命令会返回类似以下内容的输出:

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

使用上述命令检查实例的最新临时凭证。这些凭证在分配的临时凭证过期前约 5 分钟自动轮换或刷新。

相关信息

使用 AWS 凭证(适用于 Java 的 AWS 开发工具包)

使用凭证(适用于 Java 的 AWS 开发工具包 2.0)

这篇文章对您有帮助吗?

您是否需要账单或技术支持?

linux申请令牌错误,解决“请求中包含的安全令牌已过期”错误相关推荐

  1. Eclipse Android插件中的“调试证书已过期”错误

    我正在使用Eclipse Android插件来构建项目,但是在控制台窗口中出现此错误: [2010-02-03 10:31:14 - androidVNC]Error generating final ...

  2. 解决C++中调用Python脚本的LNK2001错误

    解决C++中调用Python脚本的LNK2001错误 当我们尝试在C++程序中调用Python脚本时,有时会遇到"LNK2001:无法解析的外部符号__imp_Py_Initialize&q ...

  3. 用友文件服务器不存在,用友T6软件备份提示超时已过期,错误'53'文件不存在

    用友t6软件备份提示超时已过期,错误'53'文件不存在备份提示超时已过期,错误'53'文件不存在 备份提示超时已过期,错误'53'文件不存在 原因分析:后台表ua_log日志记录太多. 问题解答:清除 ...

  4. html中jsonp错误,解决jquery中jsonp格式跨域请求报parsererror的错误

    在vs中创建一个空的mvc项目,在Controllers文件夹中添加一个控制器CommonController,并在该控制器下添加一个action用于获取服务器时间,代码如下: public Acti ...

  5. https返回400_HTTP请求中带有特殊字符|,返回400错误

    Java平台,服务器是Tomcat8,前端ajax访问服务器时,F12返回400错误,经分析,URL地址中get传参值里面含有"|", Invalid character foun ...

  6. linux下载软件失败,解决Ubuntu Kylin文件包下载失败的错误

    Ubuntu Kylin更新时出现错误是很常见的.下面大家将看到的是在Ubuntu Kylin下文件包下载失败的错误以及如何快速解决这个错误的技巧. 文件包下载失败的错误 这个错误并不仅限于Ubunt ...

  7. 解决密码中包含{},密码修改成功后, 查询分析器无法用此密码登录的问题

    <iframe align="top" marginwidth="0" marginheight="0" src="http ...

  8. linux mysql 乱码怎么解决_MySQL_linux中解决mysql中文乱码方法,改默认编码:/etc/init.d/my - phpStudy...

    linux中解决mysql中文乱码方法 改默认编码: /etc/init.d/mysql start (stop) 为启动和停止服务器 /etc/mysql/ 主要配置文件所在位置 my.cnf /v ...

  9. 错误:请求“ ..”中的成员“ ..”属于非类类型

    我有一个带有两个构造函数的类,一个不带参数,而一个带一个参数. 使用接受一个参数的构造函数创建对象的工作符合预期. 但是,如果我使用不带参数的构造函数创建对象,则会出现错误. 例如,如果我编译此代码( ...

  10. [错误解决]centos中使用kubeadm方式搭建一个单master的K8S集群

    安装步骤 参考该大佬博客 --------- [ningan@k8s-master pv]$ kubectl get pod The connection to the server localhos ...

最新文章

  1. 素数与量子物理的结合能带来解决黎曼猜想的新可能吗?
  2. 14.3.1 调用系统的拍照功能
  3. python学了可以干什么-学了Python都能干什么,哪个最赚钱?
  4. python啥意思-python是什么意思
  5. nginx 限制上传文件大小
  6. 【kafka】kafka /log_dir_event_notification的LogDir脱机事件通知
  7. jq获取下拉列表_jQuery下拉框操作系列$(option:selected,this) (锋利的jQuery)
  8. 炒股、投资免于恐惧的思考
  9. jenkins插件开发
  10. 论文赏析[EACL17]K-best Iterative Viterbi Parsing(K-best迭代维特比句法分析)
  11. Oracle宣布JDK 6死缓:计划赶不上变化
  12. 计算机在线考试报名系统软件,全国计算机软考报名官网
  13. Voxengo音频插件合集:Voxengo Total Bundle Mac
  14. 京东支付逻辑存在不安全因素
  15. HTTP 报文及作用
  16. CNtV电视直播解析PHP,电视直播
  17. java 12306 源码_java Web SpringMVC项目实现12306余票查询功能
  18. CF - 1156D - 0-1-Tree
  19. 指针进阶:函数指针的应用场景
  20. 基因编辑婴儿的意味着什么

热门文章

  1. 基于双边滤波的图像增强算法
  2. t检验怎么分析结果python_使用python 批量 配对t检验 医学 基础研究 数据分析
  3. 8.单链表实现与反转
  4. 2022身份识别技术大会 | 安全证件 | 可信身份认证 | 生物识别 | 公共安全安防身份技术展览会
  5. 计算机无法识别出硬件,电脑检测不到硬盘,电脑硬件故障检测工具
  6. TWS耳机什么值得买?入耳式蓝牙耳机排行榜10强!
  7. Excel的LOOKUP函数用法和实例以及与VLOOKUP的异同
  8. Word:一级标题行首段前距失效问题
  9. 计算机总自动开机 如何关闭,手把手教你win10电脑关机后自动开机怎么解决
  10. Java char类型介绍