You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用AWS STS API获取会话令牌时遇InvalidClientTokenId错误排查

问题排查与解决方案

以下是导致InvalidClientTokenId错误的常见原因及对应解决方法:

  • 访问密钥未正确配置
    你代码中的awsAccessKey和awsSecretKey是空字符串,必须填入有效的AWS IAM用户访问密钥。检查要点:

    • 确认密钥没有拼写错误、多余空格或换行符
    • 密钥未被禁用或过期
    • 该IAM用户已被授予sts:AssumeRole权限(可通过IAM策略配置)
  • 自定义签名实现存在缺陷
    手动实现AWSv4签名很容易出错,你的AWS4SignerForAuthorizationHeader和AWS4SignerBase类可能存在以下问题:

    • 未正确添加host头部(STS请求必须包含host: sts.amazonaws.com,你的headers中缺少这个关键头部)
    • canonical query string的编码或排序不符合AWS规范
    • 签名时使用的时间戳与UTC时间偏差过大(AWS要求时间偏差不超过15分钟)
      推荐改用AWS官方Java SDK处理STS请求,避免手动签名的麻烦,示例代码如下:
    import software.amazon.awssdk.regions.Region;
    import software.amazon.awssdk.services.sts.StsClient;
    import software.amazon.awssdk.services.sts.model.AssumeRoleRequest;
    import software.amazon.awssdk.services.sts.model.AssumeRoleResponse;
    
    public class GetSTS {
        public static void main(String[] args) {
            String awsAccessKey = "你的IAM访问密钥";
            String awsSecretKey = "你的IAM秘密密钥";
            Region region = Region.US_EAST_1;
            String roleArn = "arn:aws:iam::**************:role/Funcao";
            String roleSessionName = "AmazonSeller";
    
            // 初始化STS客户端
            StsClient stsClient = StsClient.builder()
                    .region(region)
                    .credentialsProvider(() -> software.amazon.awssdk.auth.credentials.AwsBasicCredentials.create(awsAccessKey, awsSecretKey))
                    .build();
    
            // 构建AssumeRole请求
            AssumeRoleRequest request = AssumeRoleRequest.builder()
                    .roleArn(roleArn)
                    .roleSessionName(roleSessionName)
                    .durationSeconds(3600)
                    .build();
    
            // 发送请求并获取响应
            AssumeRoleResponse response = stsClient.assumeRole(request);
            System.out.println("临时凭证信息:");
            System.out.println("AccessKeyId: " + response.credentials().accessKeyId());
            System.out.println("SecretAccessKey: " + response.credentials().secretAccessKey());
            System.out.println("SessionToken: " + response.credentials().sessionToken());
        }
    }
    
  • 端点与区域不匹配
    你使用的全局STS端点https://sts.amazonaws.com,但指定区域为us-east-1,虽然全局端点兼容,但部分场景下可能因区域参数不匹配导致签名验证失败。建议改用区域特定端点https://sts.us-east-1.amazonaws.com,确保代码中的region参数与端点一致。

  • 目标角色信任策略配置错误
    检查目标角色Funcao的信任策略,必须允许当前IAM用户(或其所属AWS账户)扮演该角色。示例信任策略如下:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::你的AWS账户ID:user/你的IAM用户名"
                },
                "Action": "sts:AssumeRole"
            }
        ]
    }
    

内容的提问来源于stack exchange,提问作者Xtreme

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 14:43:09