首页 > 解决方案 > CkRest.AddHeader 函数不使用 Chilkat C++ 添加标头(“Content-MD5”标头使用 fullRequestBinary PUT)

问题描述

我们正在使用 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 Chilkat 是否删除或忽略我们的尝试添加“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

标签: amazon-s3chilkat

解决方案


与 Chilkat 支持相对应,事实证明 Chilkat 版本 9.5.0.80 和 9.5.0.83Content-MD5在使用AWS Signature V4. 相反,Chilkat 计算 SHA256 哈希并将其放入x-amz-content-sha256(如果使用较旧的 AWS 签名 V2 进行身份验证,它会计算Content-MD5我被告知)因此,与@Chilkat Software 的评论不同,这在更高版本中尚未修复写该评论,删除是故意的。

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

x-amz-content-sha256上传部件时,AWS C++ 开发工具包本身不会在标头中使用 SHA-256 哈希。我已经确认它使用:x-amz-content-sha256:UNSIGNED-PAYLOAD而是使用“成本较低”的 MD5 哈希,并将其放在Content-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 进行内容验证的 Amazon AWS UploadPart 请求示例,而不使用 SHA256 对请求进行签名(使用 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 Signature V4 指定标头并且它不会删除它,但是,它是自动计算的 SHA-256 的补充,x-amz-content-sha256因此不必要地加倍散列,并且会最好能够为UNSIGNED-PAYLOADAWS 签名指定。

如果该值存在内容不匹配错误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>

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

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

推荐阅读