调用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
相关产品推荐
相关产品推荐

