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

7 投票
4 回答
14865 浏览
提问于 2025-04-17 23:08

我通过运行以下命令,从 epel-testing 仓库安装了 s3cmd

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

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

4 个回答

2

注意,这个问题在使用Windows 10时也会出现:

aws s3 ls s3://mybucketname/

我也有一个EC2实例,它被分配了一个拥有完全管理权限的IAM角色。我所做的就是在创建了一个拥有完全管理权限的用户后,删除了.aws/config和.aws/credentials文件,然后重新输入:

aws configure

老办法,删除再替换,帮了我大忙。

3

对于遇到同样问题的朋友,这是我的解决办法:

你需要创建或编辑一个文件,路径是 /home/vagrant/.s3cfg,然后在这个文件里把你的密钥和密码放在引号里面,比如:

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

9

我也为这个问题困扰了一个小时或两个。解决这个问题的方法是在配置s3cmd之前,先在EC2实例的环境中设置好我的安全凭证。

最简单的方法是把AWS的密钥和秘密设置为环境变量:

export AWS_ACCESS_KEY_ID=EXAMPLE_KEY
export AWS_SECRET_ACCESS_KEY=EXAMPLE_SECRET

你也可以在~/.aws目录下设置一个aws_config_file文件。

环境设置好后,运行s3cmd --configure,你就可以开始使用了。

11

在安装了s3cmd并设置了一个IAM(身份和访问管理)后,我给它附上了一个“Amazon S3完全访问”的角色,但我也遇到了“提供的令牌格式错误或无效”的错误。接着,我创建了一个新的IAM,并附上了一个包含管理员权限的策略(所有权限都给了)。

但是,使用这个新的IAM时,错误又出现了。

在github.com的一个讨论中,有人提到使用EC2(弹性计算云)和嵌入的IAM角色可能会出现一些问题,而我的EC2正是使用了s3cmd。

于是,我尝试运行。

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

使用带有S3策略的IAM密钥,这次成功了。

所以,s3cmd默认使用的是EC2中嵌入角色的凭证。我相信如果你再启动一个EC2,并给它一个可以访问S3的角色,就不会出现“提供的令牌格式错误或无效”的错误了。

不过,请不要在任何使用s3cmd的脚本中直接写入-access_key=xxxx --secret_key=xxxxxxxxxxxxx这些参数。尽量在启动EC2时嵌入角色(这是一个好的安全做法)。

总之,为了测试,我又启动了一个没有任何嵌入IAM角色的EC2,安装了s3cmd,配置后,使用我有S3策略的IAM用户,一切都按预期工作。

撰写回答