概述

OSS权限问题指当前用户没有指定操作的权限。本文主要介绍OSS权限相关的常见错误排查方法

详细描述

权限常见错误描述

OSS返回的权限相关的错误及原因见下表:

错误 原因 解决方法

ErrorCode: AccessDenied

ErrorMessage: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.

Bucket和Endpoint不符 AccessDenied.The bucket you are attempting to…错误

ErrorCode: AccessDenied
ErrorMessage: AccessDenied

说明访问OSS的用户没有当前操作的权限。 AccessDenied.AccessDenied错误

ErrorCode: InvalidAccessKeyId
ErrorMessage: The OSS Access Key Id you provided does not exist in our records.

原因可能是AccessKeyID禁用或不存在。 InvalidAccessKeyId.The OSS Access Key Id…错误

ErrorCode: SignatureDoesNotMatch 
ErrorMessage: The request signature we calculated does not match the signature you provided. Check your key and signing method.

签名不匹配。 SignatureDoesNotMatch.The request signature we calculated…错误

ErrorCode: AccessDenied

ErrorMessage: You are forbidden to list buckets.

无ListBuckets权限 如果需要修改权限,可参考基于读写权限ACL的权限控制中的权限列表赋予相应的权限。

ErrorCode: AccessDenied

ErrorMessage: You do not have write acl permission on this object

无SetObjectAcl权限

ErrorCode: AccessDenied

ErrorMessage: You do not have read acl permission on this object.

无GetObjectAcl权限

ErrorCode: AccessDenied

ErrorMessage: The bucket you access does not belong to you.

子用户没有Bucket管理的权限(如GetBucketAcl CreateBucket、DeleteBucket SetBucketReferer、 GetBucketReferer等) 如果需要修改权限,可参考教程示例:使用RAM Policy控制OSS的访问权限修改权限。

ErrorCode: AccessDenied

ErrorMessage: You have no right to access this object because of bucket acl.

子用户/临时用户没有访问Object的权限(如putObject getObject、appendObject deleteObject、postObject)等

ErrorCode: AccessDenied

ErrorMessage: Access denied by authorizer’s policy.

临时用户访问无权限,该临时用户角色扮演指定授权策略,该授权策略无权限

ErrorCode: AccessDenied

ErrorMessage: You have no right to access this object.

子用户/临时用户无当前操作权限(如initiateMultipartUpload等)

ErrorCode: AccessDenied

ErrorMessage: Invalid according to Policy: Policy expired.

PostObject中Policy无效 PostObject

ErrorCode: AccessDenied

ErrorMessage: Invalid according to Policy: Policy Condition failed:["eq", "$Content-Type", "application/octet-stream"] …

Content-Type限定了,比如请求中Content-Type限定为image/png,而实际与限定不符。 设置Content-Type

权限常见错误问题排查

说明:权限策略的生成推荐使用OSS授权策略生成工具RAM Policy Editor

如何辨别密钥是主用户或子用户还是临时用户

  • 是否是主用户的密钥:需要到控制台查看AccessKeyID是否存在,如果存在说明是主用户。
  • 查看子用户的权限,即该子用户的授权策略:在控制台选择 访问控制 > 用户,单击用户名,查看子用户的AccessKeyID,并找到对应的子用户;在控制台选择 访问控制 > 用户单击用户名,单击 权限管理查看子账户的权限
  • 查看临时用户的权限,即对应角色的权限:临时用户的AccessKeyID以STS开头比较好辨认,如"STS.MpsSonrqGM8bGjR6CRKNMoHXe"。 在控制台选择 访问控制 > RAM角色管理,单击角色名称,查看权限

    权限检查流程

    参考教程示例:使用RAM Policy控制OSS的访问权限,进行以下权限检查。

    1. 列出需要的权限和资源。
    2. 检查Action是否有需要的操作。
    3. 确认Resource是否为需要的操作对象。
    4. 确认Effect是Allow还是Deny。
    5. 确认Condition是否正确。

    调试步骤

    如果检查无法发现错误,进行如下调试。

    1. 如果有Condition,需先将其删除。
    2. Effect中删除Deny
    3. Resource替换为"Resource": "*"
    4. Action替换为"Action": "oss:*"

    更多信息

    “AccessDenied.The bucket you are attempting to…”错误

    访问OSS出现的详细报错如下。

    <Code>AccessDenied</Code> 
    <Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message>

    原因及解决方法

    访问Bucket使用的Endpoint不正确,如果您需要了解Endpoint的详细信息,请参看OSS 基本概念。如果SDK异常抛出如下的异常,或返回如下错误。可参考备注中的内容找到正确的Endpoint。

    <Error>
      <Code>AccessDenied</Code>
      <Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message>
      <RequestId>56EA****3EE6</RequestId>
      <HostId>my-oss-bucket-*****.aliyuncs.com</HostId>
      <Bucket>my-oss-bucket-***</Bucket>
      <Endpoint>oss-cn-****.aliyuncs.com</Endpoint>
    </Error>

    注:

    • 其中Endpoint中的oss-cn-****.aliyuncs.com就是正确的Endpoint,请使用http://oss-cn-****.aliyuncs.comhttps://oss-cn-****.aliyuncs.com作为Endpoint访问OSS。
    • 如果错误中没有Endpoint,请登录OSS控制台,在Bucket管理中找到您访问的Bucket,进入Bucket概览页面。OSS域名中可以看到内网和外网域名。
    • 外网域名是在公网上访问OSS使用的域名,内网域名是指在阿里云内部访问的OSS使用的域名。比如在ECS上访问OSS,可以使用内网域名。
    • Endpoint是域名去掉Bucket部分,加上访问协议。例如上图中OSS的公网域名是oss-****.aliyuncs.com,它的公网Endpoint是http://oss-cn-****.aliyuncs.com。类似,内网Endpoint是http://oss-cn-****-internal.aliyuncs.com

    “AccessDenied.AccessDenied”错误

    访问OSS出现的详细报错如下。

    <Code>AccessDenied</Code> 
    <Message>AccessDenied</Message>

    原因及解决方法

    说明访问OSS的用户没有当前操作的权限。请确认使用的AccessKeyID/AccessKeySecret是正确的。如果使用的是子帐号或临时账户(STS),请确认当前用户的权限。在访问控制管理控制台单击 用户管理,单击 需要确认权限的用户,单击 用户授权策略 > 加入组的授权策略查看该用户的权限,确认是否已经赋予当前用户Bucket或Object的操作权限。

    “InvalidAccessKeyId.The OSS Access Key Id…”错误

    访问OSS出现的详细报错如下。

    <Code>InvalidAccessKeyId</Code> 
    <Message>The OSS Access Key Id you provided does not exist in our records.</Message>

    原因及排查方法

    原因可能是AccessKeyID禁用或不存在。可参如下排查方法进行排查处理。

    1. 登录阿里云控制台的AccessKey 管理
    2. 确认访问OSS使用的AccessKeyID存在且处于启用状态。
      • 如果您的AccessKeyID处于禁用状态,请开启。
      • 如果您的AccessKeyID不存在请创建,并使用新的AccessKeyID访问OSS。

    “SignatureDoesNotMatch.The request signature we calculated…”错误

    访问OSS出现的详细报错如下。

    <Code>SignatureDoesNotMatch</Code> 
    <Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message>

    排查步骤

    1. 请检查Endpoint前面没有Bucket,后面没有多余的“/”,前后没有多余的空格。
      • 比如下面的Endpoint是不合法的。 
        • http:// oss-cn-hangzhou.aliyuncs.com
        • https:// oss-cn-hangzhou.aliyuncs.com
        • http://my-bucket.oss-cn-hangzhou.aliyuncs.com
        • http://oss-cn-hangzhou.aliyuncs.com/
      • 合法的Endpoint如下。
        • http://oss-cn-hangzhou.aliyuncs.com
    2. 请确认AccessKeyID与AccessKeySecret正确,确保AccessKeyID与AccessKeySecret前后都没有空格,特别是使用了复制粘贴的情况。
    3. 请确保BucketName与ObjectKey命名合法有效且符合要求。
      • Bucket命名规范:只能包括小写字母、数字和短横线(-),必须以小写字母或者数字开头,长度必须在3-63字节之间。
      • Object的命名规范:使用UTF-8编码,长度必须在1-1023字节之间,不能以“/”或者“\”字符开头。
    4. 如果是您自己实现的签名,请使用OSS SDK提供的签名方法。OSS的SDK提供了URL/Header签名的实现,详细请参看授权访问
    5. 如果您的环境不适合使用SDK,需要自己实现签名,签名方法请参考用户签名验证,仔细检查每个签名字段。
    6. 如果您使用了代理,请检查代理服务器是否添加额外的Header。

    相关文档

    适用于

    • 对象存储 OSS