解决腾讯云 COS 客户端报 Request has expired 的问题

这篇具有很好参考价值的文章主要介绍了解决腾讯云 COS 客户端报 Request has expired 的问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

我有一段 python 代码,是用于与腾讯云对象存储服务 COS 进行交互,从而实现对象搜索、对象下载等功能。
本地调试没问题后,想利用 docker 实现容器化部署,却报错了,提示 “AccessDenied” 以及 “Request has expired"。明明各种配置参数都一样,为什么换个地方就运行不了了呢。

结论

这里先给出根本原因和解决方案:

  • 根本原因容器的系统时间与真实时间不一致(一般是远远落后于真实时间),导致 COS 客户端在发起请求的时候,签名过期,请求失败。
  • 解决方案:共有 3 类方案:
    1. 容器使用宿主机的本地时间设置:将宿主机的 /etc/localtime 文件挂载到容器的相同路径下,并以只读模式 (ro) 进行挂载即可。但我的情况比较特殊——使用的是 podman 而非 docker,容器内的时间实际上是与虚拟机同步的,修改虚拟机的时间设置比较麻烦,折腾了一小时没成功,最终放弃这种方案。
    2. 容器使用 NTP(网络时间协议)客户端与 NTP 服务器同步时间:在容器内安装和配置 NTP 客户端,然后使用 NTP 服务器同步时间。但需要装一堆东西,很麻烦,我的容器是 alpine 系统(一个面向安全的轻型 Linux 发行版),很多包都需要重新安装,折腾了一小时没成功,最终放弃这种方案。
    3. 传递 cos 签名超时参数:相比于前面两者比较治本的方法,这种方式有点头痛医头的感觉,并且是绕过了问题。因为如果你用 time.time 或其他方法读取时间,读到的还是错误的时间。但无所谓了,能解决问题就行,详见下文。😂如果你有好的方法,也欢迎在评论区回复,感谢~

过程分析

定位问题

首先,通过翻阅官方文档,可以看到一段解释说明。
解决腾讯云 COS 客户端报 Request has expired 的问题

看上去是时间设置的问题,对比本地和容器内的时间,可以知道已经不是简单的时区问题了。因为时区一般是差 N 小时,而这已经是差了好几天了。

解决腾讯云 COS 客户端报 Request has expired 的问题

解决方案

1. 容器使用宿主机的本地时间设置

需要注意的是,该方案不适用于 podman。

解决腾讯云 COS 客户端报 Request has expired 的问题
解决腾讯云 COS 客户端报 Request has expired 的问题

2. 容器使用 NTP(网络时间协议)客户端与 NTP 服务器同步时间

如何安装 NTP 客户端并设置,跟你的系统有关,并没有统一的方案。同样操作起来很麻烦……

解决腾讯云 COS 客户端报 Request has expired 的问题
解决腾讯云 COS 客户端报 Request has expired 的问题

3. 传递 cos 签名超时参数

折腾了半天无法解决这个问题后,我决定不再想着如何根治问题,而是针对于这个案例来定向解决。

首先,根据代码报错的位置,可知是请求的时候报错,具体是在 cos_client.py 的 1391 行。这段代码主要做的就是把 URL、params、headers 以及跟用户认证有关的内容,传递给 send_request 方法,发起请求。

解决腾讯云 COS 客户端报 Request has expired 的问题
跟签名过期有关的内容,一般要么放在 header 里,要么放在 auth 里,依次查看内容后,很容易看到答案就在 CosS2Auth 里。但麻烦的是,我们并没有办法传递或修改这个 expire 参数值。

解决腾讯云 COS 客户端报 Request has expired 的问题
解决腾讯云 COS 客户端报 Request has expired 的问题

那么只能把这段代码复现一下,唯一区别就是指定了 CosS2Auth 里的 expire 值。

下面以 list_objects 举个例子:

修改前,直接使用 cos_client 对象的 list_objects 函数

cos_client.list_objects(Bucket=bucket, Prefix=prefix, Delimiter="/", Marker=marker)

修改后,把 list_objects 的源代码拷贝出来,放在自己重新定义的 list_objects 函数里,但是额外在初始化 CosS2Auth 实例时传递 expire 值。

解决腾讯云 COS 客户端报 Request has expired 的问题文章来源地址https://www.toymoban.com/news/detail-483090.html

到了这里,关于解决腾讯云 COS 客户端报 Request has expired 的问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 手机、电脑mqtt客户端通过腾讯云服务器远程连接ESP32

            本文将实现:         1、esp32与腾讯云物联网服务器通过mqtt协议通信         2、电脑和手机客户端通过mqtt与腾讯云相通信         3、腾讯云服务器内部消息转发,将手机、电脑发布的主题转发给esp32订阅,实现手机、电脑与esp32的远程通信。      

    2024年02月11日
    浏览(62)
  • 64、ubuntu20.04安装Postman测试http通信和测试其libcurl支持http客户端发送request

    基本思想:需要使用http协议完成业务需求,需要测试一下,所以学习一下想关的应用实践 一、下载Postman Postman 帐号某宝解决,也可以试用30天 二、固定postman到任务栏图标 添加内容  再次设置一下图标。使用下列命令打开Postman然后用十字光标点击一下postman工具,显示下列字

    2023年04月08日
    浏览(52)
  • 【异常】客户端发起HTTPS请求报错,服务端返回400 Bad Request ,并且提示No required SSL certificate was sent

    HTTP响应码400表示客户端发送了一个无效的请求。这可能是由于请求中缺少必需的参数或格式不正确等原因导致的。服务器无法处理此请求并返回400响应码。如果您正在编写Web应用程序,建议在处理请求时检查请求的有效性,并在必要时返回400响应码以指示客户端请求无效。

    2024年02月11日
    浏览(54)
  • 前端解决客户端不安全随机数

    前端项目在安全漏洞扫描的时候,爆出了客户端不安全随机数的问题,看了下代码是因为使用了 Math.random() 生成随机数造成的。 百度了一下,math.random()并不是真的随机数,而是伪随机数! 原因 Math.random() 函数是 JavaScript 内置的一个函数,它用于生成一个 0 到 1(包括0,不包括

    2024年02月16日
    浏览(44)
  • java webSocket服务端、客户端、心跳检测优雅解决

    项目分为三个端,项目之间需要webSocket通信。 WebSocketConfig WebSocketServer

    2024年02月17日
    浏览(41)
  • Unity解决Udp客户端无法接收数据的问题

    在我之前做过的项目中,其中不少涉及Udp客户端的项目。在这些项目中,一般只需要实现客户端向服务器端发送数据的功能就可以了,一般都不用接收服务器端发送的数据,但是也有同学使用了我分享的udp客户端插件,说是接收不到服务器端发送的数据。我也一直没时间修改

    2024年01月17日
    浏览(55)
  • SSL VPN客户端常见报错及解决方法

    SSL VPN 指的是基于安全套接字层协议 (Security Socket Layer-SSL) 建立远程安全访问通道的 VPN 技术。 SSL 协议 主要是由 SSL 记录协议和 握手协议 组成,它们共同为应用访问连接提供认证、加密和 防篡改 功能。 SSL 握手协议相对于 IPSEC 协议体系中的 IKE( 互联网密钥交换协议 ) 协议,

    2024年02月08日
    浏览(48)
  • rabbitmq中客户端30分钟未ack报错解决

    错误日志 : ERROR MESSAGE 这个错误发生在 RabbitMQ 客户端,提示连接已经被关闭,并给出了关闭的原因: close-reason,由对等方(Peer)发起; code=406,表示 PRECONDITION_FAILED; text=‘PRECONDITION_FAILED - delivery acknowledgement on channel 1 timed out. Timeout value used: 1800000 ms. This timeout value can be

    2024年02月10日
    浏览(43)
  • 通过 EPOLL 解决客户端同时连接多服务器的问题

    项目需求是  程序上 同时配置了多个服务端 设备 每隔一段时间需要 比如1分钟 连一下服务器看下是否连通   并将结果上报给平台  原来是用线程池来做的   具体大概就是 定时器到了之后  遍历设备列表  找到设备之后  通过 socket连接 发送一个指令 等待服务器返回 用来

    2024年02月13日
    浏览(40)
  • “因为算法不同,客户端与服务器无法通信。”的解决方法

    最后根据微软文档的说明,改动注册表就成功了:传输层安全性 (TLS) 注册表设置 | Microsoft Docs 在注册表编辑器,找到以下注册表项/文件夹:HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSecurityProvidersSCHANNELProtocols 具体我的做法是: 1、把几个“SSL”的关闭掉,就是把它的“Enable

    2024年02月16日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包