功能链接:
https://help.aliyun.com/document_detail/91911.html?spm=a2c4g.91913.0.0.97d865baBaJjdm
使用的是官方提供的sdk
提前准备了:
主账号id
主账号开设角色
主账号角色配置STS权限、访问目标资源的权限
主账号角色配置信任策略roleARN
子账号accessKey和密钥
使用了aliyun-java-sdk-core:3.4.0版本
后来又使用了sts20150401这个jar包
先是client.assumeRoleWithOptions获取了securityToken和accessKeyId和AccessKeySecret
就这里获取到的Expiration时间就是过期了的,但是也没有影响下一步
然后用这个继续获取GetSigninToken,获取成功了
然后用signinToken生成链接,这个链接无法使用,提示
我跟了一下sdk的源码,发现里面有个Timestamp参数,获取的时间是GMT时间,比北京时间晚8小时
现在是11点16分,获取的时间是凌晨3点16分,我手动把时间改掉,会导致请求失败
不知道这个是不是bug,文档也没有说明,很烦恼。。。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您描述的问题,主要涉及STS(Security Token Service)的使用过程中时间戳(Timestamp)参数导致的异常情况。以下是针对问题的详细分析和解决方案:
您在使用阿里云STS服务时,通过client.assumeRoleWithOptions
获取了临时凭证(包括securityToken
、accessKeyId
和AccessKeySecret
),但发现以下问题: - 获取的Expiration
时间已经过期。 - 使用生成的signinToken
生成登录链接后,链接无法正常使用。 - 调试过程中发现SDK中的Timestamp
参数使用的是GMT时间,比北京时间晚8小时,手动修改时间会导致请求失败。
Timestamp
参数用于标识请求的时间,要求为UTC时间格式(即GMT时间)。Timestamp
与服务器时间不一致,触发了签名验证失败。Expiration
时间过期Expiration
字段表示临时凭证的有效期,通常由STS服务返回。Expiration
时间已经过期,可能是由于以下原因:
GetSigninToken
接口生成的signinToken
需要结合正确的Timestamp
和Expiration
才能生成有效的登录链接。Timestamp
或Expiration
存在问题,生成的链接将无法通过验证。ntpdate
命令)进行时间校准。Timestamp
可能导致签名验证失败,建议不要直接干预SDK生成的时间戳。roleARN
)。accessKey
和密钥是否具有调用STS服务的权限。Expiration
有效期AssumeRole
接口时指定DurationSeconds
参数(最大值为3600秒)。AssumeRoleRequest request = new AssumeRoleRequest();
request.setRoleArn("acs:ram::123456789012:role/example-role");
request.setRoleSessionName("example-session");
request.setDurationSeconds(3600); // 设置有效期为1小时
GetSigninToken
接口调用GetSigninToken
接口的请求参数正确,特别是Session
字段中的accessKeyId
、accessKeySecret
和securityToken
。GetSigninTokenRequest tokenRequest = new GetSigninTokenRequest();
tokenRequest.setSession("{\"accessKeyId\":\"your-access-key-id\",\"accessKeySecret\":\"your-access-key-secret\",\"securityToken\":\"your-security-token\"}");
GetSigninTokenResponse tokenResponse = client.getSigninToken(tokenRequest);
String signinToken = tokenResponse.getSigninToken();
signinToken
生成登录链接时,确保Destination
参数指向正确的控制台地址。String loginUrl = "https://signin.aliyun.com/federation?Action=Login&LoginUrl=https://your-console-url&SigninToken=" + signinToken;
aliyun-java-sdk-core:3.4.0
和sts20150401:1.1.3
版本。建议升级到最新版本,以避免潜在的Bug。Timestamp
的时间格式问题,建议联系阿里云技术支持团队反馈此问题。通过以上步骤,您可以解决因Timestamp
时间戳和Expiration
有效期导致的问题。如果问题仍未解决,建议提供详细的日志信息(包括请求参数和响应结果)以便进一步排查。
希望以上解答对您有所帮助!您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。