CkRest.AddHeader 函数不使用 Chilkat C++ 添加标头(使用 fullRequestBinary PUT 的“Content-MD5”标头)

2023-12-25

我们正在使用 Chilkat 9.5.0.80 C++ 库。

我们无法将某个 HTTP 标头添加到请求中:“Content-MD5”。当我们像这样添加这个标头时:

m_ckRest.AddHeader("Content-MD5", "any-value-here");

并检查生成的请求*,“Content-MD5”标头不存在。

但是,当我们添加不同名称的标头时:

m_ckRest.AddHeader("Content-Type", "application/octet-stream");

...生成的请求确实包含该标头。我们使用“fullRequestBinary”方法,例如:

const char* responseStrPtr = m_ckRest.fullRequestBinary( "PUT", encodedObjectName.c_str(), ckByteDataBuffer);

* 我们正在使用代理检查我们的请求(例如,使用“Fiddler”作为我们和 Amazon S3 之间的 http 代理来测试多部分 AWS S3 上传中“部分”的上传),并且在每次尝试中,“内容-MD5" 标头不存在,而其他标头存在。

这是一个错误吗?我们发现 2013 年的一篇旧论坛帖子引用了一个听起来非常相似的问题:http://www.chilkatforum.com/questions/2901/addheader-range-does-not-appear-to-be- effective http://www.chilkatforum.com/questions/2901/addheader-range-does-not-appear-to-be-effectiveChilkat 是否删除或忽略我们添加“Content-MD5”标头的尝试?这个错误是否在比我们正在使用的版本更新的版本中得到修复?有解决方法吗?以下是 PUT 请求中标头的示例:

PUT https://our-bucket.s3.us-west-1.amazonaws.com/somefile?partNumber=4&uploadId=tJJYIXdxG_7X8elzSJrKt32A_rH46Y0Yk1vyzZgwxpvmK5uCrcE82k_F9UmytVHWuxXfc6tX5o3w.SRnnYcD7VBskcLrr0xC13bHHVDx62iGGQ3eIzkv5J5d1F4_DkcW HTTP/1.1
Content-Length: 5266235
x-amz-date: 20200921T201943Z
x-amz-content-sha256: 90fa8fc564dd558d0c2eac92e367d94101f4ca9570c970795b9fdb2aa96d6666
Host: our-bucket.s3.us-west-1.amazonaws.com
Content-Type: application/octet-stream
Date: Mon, 21 Sep 2020 20:19:43 GMT
Authorization: AWS4-HMAC-SHA256 Credential=AKIAIBYS55OSD2FIOBFUS/20200921/us-west-1/s3/aws4_request,SignedHeaders=content-type;host;x-amz-content-sha256;x-amz-date,Signature=8ea74cb7769d8e158e5ccc0604cc2cdb096703b10c3c8d9323d0746debbdUUU

根据 Chilkat 支持,事实证明 Chilkat 版本 9.5.0.80 和 9.5.0.83 有意删除了Content-MD5进行身份验证时使用标头AWS Signature V4。相反,Chilkat 计算 SHA256 哈希值并将其放入x-amz-content-sha256(如果使用较旧的 AWS 签名 V2 进行身份验证,则会计算Content-MD5有人告诉我)因此,与 @Chilkat Software 的评论不同,在撰写该评论时,此问题尚未在后续版本中得到修复,并且删除是有意的。

这并不可怕,但它源于一种误解,即内容的 SHA-256 哈希对于构建有效的 AWS Signature V4 进行身份验证是必要的,而事实上这是not案子。虽然 SHA256 完全适合内容验证,但与用于内容验证的 MD5 相比,它也很浪费。

AWS C++ 开发工具包本身不使用 SHA-256 哈希x-amz-content-sha256上传部分时的标头。我已经确认它使用:x-amz-content-sha256:UNSIGNED-PAYLOAD而是使用“成本较低”的 MD5 哈希值,并将其放入Content-MD5标头(请参阅此处的 AWS 文档https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html)

无符号有效负载选项 – 您包含文字字符串 UNSIGNED-PAYLOAD 在构造规范请求时,并设置 与发送时的 x-amz-content-sha256 标头值相同的值 向 Amazon S3 发出请求

以下是 Amazon AWS UploadPart 请求的示例,该请求使用 Content-MD5 进行内容验证,而不使用 SHA256 签署请求(使用适用于 C++ 的 AWS 开发工具包从请求中捕获):

PUT https://mybucket.s3.us-west-1.amazonaws.com/somefile.mfs01?partNumber=1&uploadId=6CHL6tPKFcRSoxD4iysjKMgQCNfcFAt87bn4fsduV1YI5_aFIz9e36BxFURH_iEX8EChUtQm06qT9oyIUDbAnA.2M.novpBBKsnGl_NqNvVllQ7L1VK6x1PiLlqq46tH HTTP/1.1
Cache-Control: no-cache
Connection: Keep-Alive
Pragma: no-cache
Content-Type: binary/octet-stream
Content-MD5: PV204S0m8zJY8zu9Q3EF+w==
Accept: */*
Authorization: AWS4-HMAC-SHA256 Credential=AKIAIBYS55OSD2FOBFUSC/20200923/us-west-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;amz-sdk-request;content-length;content-md5;content-type;host;x-amz-content-sha256;x-amz-date, Signature=d013028d77e45f3dcce5f46f3fb53cdeeb3c9cfbd931371e69a9925047e61cd3
Host: nuix-nov-dev.s3.us-west-1.amazonaws.com
User-Agent: aws-sdk-cpp/1.7.333 Windows/10.0.19041.329 x86 MSVC/1927
amz-sdk-invocation-id: E57D09A7-B5E7-4E2A-8B2D-B493147F06D7
amz-sdk-request: attempt=1
x-amz-content-sha256: UNSIGNED-PAYLOAD
x-amz-date: 20200923T212738Z
Content-Length: 5242880

Chilkat 为我们提供了一个新的“测试版”版本,允许我们指定Content-MD5即使对于 AWS Signature V4,它也不会删除它,但是,它是对自动计算的 SHA-256 的补充x-amz-content-sha256所以这不必要地加倍了散列,并且最好能够指定UNSIGNED-PAYLOAD出于 AWS 签名的目的。

如果出现内容不匹配错误Content-MD5值,AWS 返回此值(状态为 400):

<?xml version="1.0" encoding="UTF-8"?>
<Error>
    <Code>InvalidDigest</Code>
    <Message>The Content-MD5 you specified was invalid.</Message>
    <Content-MD5>thisisbad</Content-MD5>
    <RequestId>8274DC9566D4AAA8</RequestId>
    <HostId>H6kSy4cl+54nMon1Hq6AGjmTX/MfTVMQQr8vEVNXUnPlfMtIt8HPdObfusckhBpwpG/CJ6ORWv16c=</HostId>
</Error>

如果内容与x-amz-content-sha256AWS 返回以下错误,我在网上很难找到该错误,并且略有不同,因此粘贴到此处(也是状态 400):

Status:400 : AWSCode: XAmzContentSHA256Mismatch : AWSMessage: The provided 'x-amz-content-sha256' header does not match what was computed.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CkRest.AddHeader 函数不使用 Chilkat C++ 添加标头(使用 fullRequestBinary PUT 的“Content-MD5”标头) 的相关文章

  • Haskell Servant 和流媒体

    我正在尝试添加一个功能到我的servant服务器将从 Amazon S3 获取文件并将其流式传输回用户 由于文件可能很大 我不想将它们下载到本地然后将它们提供给客户端 我宁愿将它们直接从 S3 流式传输到客户端 I use Amazonka
  • 使用 boto3 将 csv 文件保存到 s3

    我正在尝试写入 CSV 文件并将其保存到 s3 中的特定文件夹 存在 这是我的代码 from io import BytesIO import pandas as pd import boto3 s3 boto3 resource s3 d
  • 更新通过 JungleDisk 上传的 Amazon S3 文件的权限

    我开始使用 Jungle Disk 将文件上传到与 Cloudfront 发行版相对应的 Amazon S3 存储桶 即我可以通过 http URL 访问它 并且我使用 Amazon 作为 CDN 我面临的问题是 Jungle Disk 没
  • Amazon S3 无法通过 Cloudfront 上传文件

    我想通过 Cloudfront 使用签名 URL 将文件上传到 S3 Cloudfront 行为中允许 HTTP PUT 桶策略 Sid 2 Effect Allow Principal AWS arn aws iam cloudfront
  • CORS 与 Amazon S3 和 Cloudfront

    我有一个托管在 Heroku 上的 Rails 应用程序 它使用 CloudFront 以及托管在 S3 上的资产 它完美地显示了资产 尽管需要一些努力 我的 Cloudfront 设置 Forward Headers Whitelist
  • 为什么 S3 上的压缩文件返回 403 Forbidden 错误?

    我正在使用 django compressor 和 django storages 在 S3 上提供我的压缩文件 使用以下说明 http django compressor readthedocs org en latest remote
  • 更新AWS S3过期时间

    我想知道如何延长密钥的有效期 我指的不是访问对象的签名 URL 而是密钥本身 我将 AWS 设置为存储桶中的所有对象应在 90 天后过期的规则 在大多数情况下 这就是我希望发生的事情 有时我需要将单个密钥的使用寿命最多再延长 90 天 事实
  • 将文件从 CodeCommit 部署到 S3

    我想将推送到 CodeCommit 存储库中的某些文件部署到 S3 存储桶中 我正在尝试使用存储库上的 Lambda 触发器来执行此操作 但是 我无法获取提交中更改的文件列表 也无法使用 AWS CodeCommit API 从 CodeC
  • 关于 S3 文件传输的权限

    我正在使用 S3TransferManager Sample 进行测试 我创建了Cognito并设置了IAM并最后更改了constants swift文件 我上传没有问题 但下载失败 错误信息是 下载失败 错误域 com amazonaws
  • S3 存储桶可以生成自己的对象键名称吗?

    我正在将 Amazon API Gateway 配置为 S3 存储桶的代理 理想情况下 我希望客户端能够将文件发布到存储桶 让 S3 为其分配一个文件名 然后在响应中返回该名称 我不想让客户端能够指定文件名 这可能吗 设置代理的文档根本没有
  • 如何在使用 Active Storage 上传之前调整图像大小(与 AWS 链接)

    我尝试将 Active Storage 与 Amazon Web Services 结合使用 而不是 Carrierwave 和 Cloudinary 使用 Carrierwave 我有一些功能可以在通过上传器控制器上传之前调整图像大小 但
  • Amazon Web Services:设置 S3 策略以允许 putObject 和 getObject 但拒绝 listBucket

    我在 Amazon S3 上使用 getObject 和 putObject 请求 并在创建访问存储桶的策略时发现 如果我不允许 listBucket 则会收到 访问被拒绝 错误 这样做的问题是 listBucket 意味着用户可以列出存储
  • 在 Amazon Redshift COPY 命令中转义分隔符

    我正在将数据从 Amazon S3 提取到 Amazon Redshift 中的表中 该表包含多个列 其中某些列数据可能包含特殊字符 复制命令有一个选项称为Delimiter我们可以在将数据拉入表时指定分隔符 问题有2个方面 当我导出时 u
  • 我们能否知道回形针下载何时完成?

    我有一个应用程序 我需要知道用户的 Rails Paperclip 文件下载时间complete 我的应用程序设置为与 Amazon S3 交互 当用户收到完整的文件时 我需要运行 JavaScript 函数 我怎样才能做到这一点 跟踪天气
  • X-Amz-Expires 是向 AWS 发出的请求所需的标头/参数吗?

    Is X Amz Expires必需的标头 参数 官方文档不一致 用在一些例子 http docs aws amazon com AmazonS3 latest API sigv4 query string auth html 虽然不在ot
  • s3 中托管的静态网站:页面刷新后返回 404

    使用此存储桶策略 Version 2012 10 17 Statement Sid PublicReadGetObject Effect Allow Principal Action s3 GetObject Resource arn aw
  • kafka 连接 s3 源无法与 Minio 一起使用

    我已经验证了与 minio 的连接 确保凭据工作正常并且可以访问 minio 另外 如果我尝试任何其他值store url http minio 9000我无法保存配置 所以我猜想在可见性方面不存在问题卡夫卡连接容器和minio容器 我不确
  • 可以使用带有 HTML5 播放器的 Amazon S3/CloudFront 流式传输视频吗?

    我想使用 HTML5 视频播放器并流式传输视频 S3 CloudFront 可以实现这一点吗 我了解 Amazon 使用 RTMP 流媒体协议和 HTML5video标签不支持 RTMP 有没有办法用 HTML5 播放器播放视频 Wayne
  • AWS S3从本地主机批量上传php错误

    我在尝试着批次 散装从本地主机 xampp 上传到我的S3 bucket 它似乎适用于大约 6 个项目 然后我收到一条错误消息 cURL 错误说Failed sending network data from http curl haxx
  • JavaScript 可以检测用户的浏览器是否支持 gzip 吗?

    我可以使用 JavaScript 来检测用户的浏览器是否支持 gzip 压缩内容 客户端 而不是 Node js 或类似内容 我正在尝试支持以下边缘情况 有很多可能的文件可以加载到特定的 Web 应用程序上 最好在应用程序运行时根据需要加载

随机推荐