本文介绍访问OSS时出现403错误的常见原因及解决方案。

UserDisable.UserDisable错误

当您访问OSS遇到如下的UserDisable错误:

<Code>UserDisable</Code>
<Message>UserDisable</Message>

有以下两类原因:

  • 欠费被禁

    确认欠费方法:在OSS 管理控制台上打开费用中心,检查是否欠费。如果欠费,请及时充值。

    说明
    • OSS欠费后,还可以正常使用24小时,24小时后禁止访问。
    • 历史数据保留15天,15天后历史数据将被删除。
    • 当您在消息中心看到阿里云OSS欠费提醒后,请及时充值,否则会影响您的正常使用。
  • 安全原因被禁

    在OSS 管理控制台上打开消息中心,在右侧的安全消息中查看违规通知。违规的原因有很多,例如您使用OSS做私服,您的图片涉黄、涉暴等。

    说明 如果您有账户处于被禁状态,请务必处理,重新申请新账户,无法保证正常使用。

RequestTimeTooSkewed.The difference between…错误

访问OSS遇到如下的RequestTimeTooSkewed错误:

<Code>RequestTimeTooSkewed</Code>
<Message>The difference between the request time and the current time is too large.</Message>

原因:您发送请求的时间与OSS收到请求的时间,间隔超出了15分钟,OSS从安全考虑认为该请求是无效的,返回上述错误。请检查发送请求设备的系统时间,并根据时区调整到正确时间。

您可能会有下面的疑问:

  • 发送请求的机器或设备的系统时间,调整标准是什么呢?

    OSS的系统时间采用GMT时间,您的设备的系统时间,需要调整到GMT时间,或与其相对应的时区时间。GMT(Greenwich Mean Time)是零时区的区时,即世界标准时间。

    例如,您访问OSS的设备系统配置是东八区,系统时间调整到比GMT早8小时。我国的标准时间—北京时间—就是东八区时间。如果您的系统时间是东八区,那么您的系统时间调整到北京时间即可。

    • Windows系统查看时区的方法:

      通过控制面板 > 时钟、语言和区域 > 设置日期和时间,打开日期和时间,时区栏的+08:00表示您的设备时区是东八区。

    • Linux/Unix系统查看时区的方法:

      请执行date -R查看时间和时区。下图中的 +0800,表示您的设备系统时区是东八区。

      time
  • 使用多个地域的OSS,例如杭州、新加坡、美国,时间同步有问题吗?

    没有问题。每个地域的OSS都使用GMT时间,您发送请求的设备系统时间也是GMT时间。

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禁用或不存在。排查方法如下:

登录阿里云控制台的 AccessKey 管理,确认访问OSS使用的AccessKeyID存在且处于启用状态。

  • 如果您的AccessKeyID处于禁用状态,请开启。
  • 如果您的AccessKeyID不存在请创建,并使用新的AccessKeyID访问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 基本概念

怎么找到正确的Endpoint呢?

如果SDK异常抛出如下的异常,或返回如下错误:

<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

ImageDamage.The image file may be damaged错误

访问OSS遇到如下的错误:

<Code>ImageDamage</Code>
<Message>The image file may be damaged.</Message>

原因:说明图片文件有部分信息丢失或损坏,导致无法正常识别或处理。您可能会有一个疑问,某图片在本地用图片处理器可以打开,但是使用OSS处理时报错。原因是,图片浏览器会对损坏的图片做些处理,OSS图片服务暂时没有这个操作。

AccessDenied.AccessDenied错误

访问OSS遇到如下的错误:

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

原因:说明访问OSS的用户没有当前操作的权限。请确认使用的AccessKeyID/AccessKeySecret是正确的。如果使用的是子帐号/临时账户(STS),请确认当前用户的权限。确认方法:

访问控制管理控制台单击用户管理,单击需要确认权限的用户,单击用户授权策略 > 加入组的授权策略查看该用户的权限,确认是否已经赋予当前用户Bucket/Object的操作权限。

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

    请检查endpoint前面没有Bucket,后面没有多余的/,前后没有多余的空格。例如下面的endpoint均不合法:http://my-bucket.oss-cn-hangzhou.aliyuncs.comhttp://oss-cn-hangzhou.aliyuncs.com/http:// oss-cn-hangzhou.aliyuncs.com以及https:// oss-cn-hangzhou.aliyuncs.com

  2. 检查AccessKeyID/AccessKeySecret

    请确认AccessKeyID/AccessKeySecret正确,确保AccessKeyID/AccessKeySecret前后都没有空格,特别是使用了复制粘贴的情况。

  3. 检查BucketName/ObjectKey

    请确保BucketName/ObjectKey命名合法有效,符合要求。

    • Bucket命名规范:只能包括小写字母、数字和短横线(-),必须以小写字母或者数字开头,长度必须在3-63字节之间。
    • Object的命名规范:使用UTF-8编码,长度必须在1-1023字节之间,不能以“/”或者“\”字符开头。
  4. 如果是您自己实现的签名,请使用OSS SDK提供的签名方法。

    OSS SDK提供了URL/Header签名的实现,详细请参看授权访问

  5. 如果您的环境不适合使用SDK,需要自己实现签名,签名方法请参考用户签名验证,仔细检查每个签名字段。

    OSS的论坛上提供了一个可视化签名的工具,请比较每个签名字段和最后的签名,签名工具地址

  6. 如果您使用了代理,请检查代理服务器是否添加额外的Header。

其它错误

请根据SDK返回的错误码、错误信息判断原因,特别是错误信息会提示错误原因。如果怀疑错误跟网络环境有关,请使用ossutil排查问题,ossutil会给出可能的原因。