错误:测试失败:400(invalid token):提供的令牌格式不正确或无效

2024-05-15 05:57:25 发布

您现在位置:Python中文网/ 问答频道 /正文

s3cmd是通过运行以下命令从epel-testingrepo安装的:

yum --enablerepo epel-testing install s3cmd

然后我用s3cmd --configure调用了配置工具,但出现了以下错误:

Test access with supplied credentials? [Y/n] 
Please wait, attempting to list all buckets...
ERROR: Test failed: 400 (InvalidToken): The provided token is malformed or otherwise invalid.

Invoked as: /usr/bin/s3cmd --configureProblem: AttributeError: 'S3Error' object has no attribute 'find'
S3cmd:   1.5.0-beta1
python:   2.6.8 (unknown, Mar 14 2013, 09:31:22) 
[GCC 4.6.2 20111027 (Red Hat 4.6.2-2)]

Traceback (most recent call last):
  File "/usr/bin/s3cmd", line 2323, in <module>
    main()
  File "/usr/bin/s3cmd", line 2221, in main
    run_configure(options.config, args)
  File "/usr/bin/s3cmd", line 1704, in run_configure
    if e.find('403') != -1:
AttributeError: 'S3Error' object has no attribute 'find'

我确信钥匙是正确的。

你知道这件事吗?


更新2014年3月21日星期五22:44:42 ICT

在调试模式下运行时找到一些线索。

使用相同的凭据,在工作的系统上:

DEBUG: SignHeaders: 'GET\n\n\n\nx-amz-date:Fri, 21 Mar 2014 07:07:18 +0000\n/'

在故障系统上:

DEBUG: SignHeaders: 'GET\n\n\n\nx-amz-date:Fri, 21 Mar 2014 07:40:56 +0000\nx-amz-security-token:AQoDYXdzENb...\n/'

此安全令牌来自元数据:

# wget -O - -q 'http://169.254.169.254/latest/meta-data/iam/security-credentials/myrole'
{
  "Code" : "Success",
  "LastUpdated" : "2014-03-21T12:45:27Z",
  "Type" : "AWS-HMAC",
  "AccessKeyId" : "foo",
  "SecretAccessKey" : "bar",
  "Token" : "AQoDYXdzENb....",
  "Expiration" : "2014-03-21T19:18:02Z"
}

所以我的问题应该改为:为什么有时在运行--configure(我没有使用--add-header)时s3cmd会向头添加x-amz-security-token


Tags: intesttokenbinconfigureusrlinefind
3条回答

这也让我耽搁了一两个小时。我在EC2实例上解决这个问题的方法是在配置s3cmd之前在环境中设置安全凭据。

最简单的方法是将AWS密钥和Secret添加为环境变量:

export AWS_ACCESS_KEY_ID=EXAMPLE_KEY
export AWS_SECRET_ACCESS_KEY=EXAMPLE_SECRET

您还可以在~/.aws中设置aws配置文件。

设置好环境后,运行s3cmd--configure,应该设置为go。

安装s3cmd、设置IAM并附加“Amazon S3 Full Access”角色之后,我也遇到了“提供的令牌格式不正确或无效”错误。接下来,我创建了一个IAM并附加了一个带有管理员凭据(所有内容)的策略。

使用此新IAM时再次出现错误。

在github.com线程中,@mdomsch提到了使用带有嵌入式IAM角色的EC2时可能出现的一些问题——这正是使用s3cmd的EC2所具有的功能。

接下来,我试着跑。

s3cmd --access_key=xxxx --secret_key=xxxxxxxxxxxxx ls

将IAM密钥与S3策略一起使用,就可以工作了。

因此,s3cmd默认采用EC2中嵌入角色的凭据。我确信,如果您启动另一个具有S3访问权限的角色的EC2,则不会出现“提供的令牌格式不正确或无效”错误。

但是-请不要使用s3cmd将-access_key=xxxx --secret_key=xxxxxxxxxxxxx参数粘贴到任何脚本中。在任何可能的地方-尝试在启动ec2时将角色嵌入其中(良好的安全实践)

无论如何-为了测试-我启动了另一个EC2,其中包含任何嵌入的IAM角色,安装了s3cmd,并进行了配置-使用我的IAM用户(拥有S3策略)的所有功能都按预期工作。

对于那些有同样问题的人,这是我的解决方案: 创建/编辑文件/home/vagrant/.s3cfg并在引号之间添加密钥和密钥,例如:

access_key="BLAHBBLAHBBLAHBBLAHB" secret_key="2T0wyvmhfGw42T0wyvmhfGw4+-"

相关问题 更多 >

    热门问题