当前位置: 首页 > 知识库问答 >
问题:

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

尉迟卓
2023-03-14

我们正在使用Chilkat9.5.0.80C库。

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

<代码>m_ckRest。AddHeader(“Content-MD5”,“此处任意值”)

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

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

<代码>m_ckRest。AddHeader(“内容类型”,“应用程序/八位字节流”)

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

const char*responseStrPtr=m_ckRest。fullRequestBinary(“PUT”,encodedObjectName.c_str(),ckByteDataBuffer)

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

这是一个bug吗?我们发现2013年的一篇旧论坛帖子提到了一个听起来很相似的问题:http://www.chilkatforum.com/questions/2901/addheader-range-does-not-appear-to-be-effectiveChilkat是否删除或忽略了我们添加“Content-MD5”标头的尝试?这个bug是在比我们使用的版本更新的版本中修复的吗?有解决办法吗?以下是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

共有2个答案

冯阳云
2023-03-14

这个问题应该已经在Chilkat的更高版本中得到解决。

徐俊楚
2023-03-14
匿名用户

在与Chilkat支持的通信中,发现Chilkat版本9.5.0.80和9.5.0.83在使用< code>AWS签名V4进行身份验证时有意删除了< code>Content-MD5报头。相反,Chilkat计算SHA256哈希并将其放入< code > x-amz-Content-sha 256 (如果使用旧的AWS签名V2进行身份验证,它会计算< code>Content-MD5,我被告知)因此,与@Chilkat Software的评论不同,在撰写该评论时,这一问题在较新的版本中尚未得到解决,删除是有意的。

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

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

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

以下是使用Content-MD5进行内容验证,而不使用SHA256对请求进行签名的Amazon AWS UploadPart请求的示例(使用AWS SDK for C从请求中捕获):

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 签名 V4 也是如此,并且它不会删除它,但是,它是自动计算的 SHA-256 x-amz-content-sha256 的补充,因此不必要地将哈希加倍,并且能够更好地为 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>

如果存在与< code > x-amz-content-sha 256 不匹配的内容,AWS将返回以下错误,我在网上很难找到该错误,因此粘贴到此处略有不同(也是状态400):

Status:400 : AWSCode: XAmzContentSHA256Mismatch : AWSMessage: The provided 'x-amz-content-sha256' header does not match what was computed.

 类似资料:
  • 我正在实现Apiary的其他同事制作的API。io,在Windows应用商店应用程序项目中。 它们显示了我必须实现的方法的示例: 在这个和其他一些方法中,我需要有一个带有我之前获得的令牌的标头。 如何将该授权标头添加到请求中?

  • 我试图使用HttpClient将“Accept Encoding”参数添加到我的HTTP头中,如“gzip,deflate”。代码如下所示。但是,我在响应中遇到以下错误,无法添加header参数。响应不包含添加的标题字段 错误:内部服务器错误

  • 我已经使用SpringFox build将集成到我的Spring Boot项目中,它适用于我的GET API。但是,在我的POST API(它需要格式的请求)中,swagger-ui没有设置头。 这个问题与这个帖子类似,但没有解决方案,任何帮助都很感谢。

  • 我想把x-frame-options添加到AWS CloudFront服务中,作为在S3桶上为我的应用程序提供服务的原点。 我不想添加新的Lambda函数来编辑请求头。 其实我在附文件下面找到了一个地方: 我如何在没有Lambda函数的情况下直接使用现有的AWS CloudFront面板来添加头?

  • 我尝试使用load CSV with headers命令将以下节点加载到Neo4j中: 我将Excel-Sheet保存为: 所以有6个节点(就像我有6行一样),但它们都没有任何属性 我已经尝试用不同的分隔符保存文件,或者手动添加引号。后者给出: PS:我在stackoverflow上阅读了关于这个主题的所有其他帖子,但没有一个能帮我解决这个问题 给予:

  • 本文向大家介绍JavaScript ES6箭头函数使用指南,包括了JavaScript ES6箭头函数使用指南的使用技巧和注意事项,需要的朋友参考一下 胖箭头函数(Fat arrow functions),又称箭头函数,是一个来自ECMAScript 2015(又称ES6)的全新特性。有传闻说,箭头函数的语法=>,是受到了CoffeeScript 的影响,并且它与CoffeeScript中的=>语