问题描述
我们正在使用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);
*我们正在使用代理(例如,在我们和Amazon S3之间使用“ fiddler”作为http代理来检查我们的请求)来测试多部分AWS S3上传中的“部分”上传),并且每次尝试, “ Content-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
解决方法
与Chilkat支持相对应,事实证明,在使用Content-MD5
进行身份验证时,Chilkat版本9.5.0.80和9.5.0.83故意删除了AWS Signature V4
标头。相反,Chilkat会计算SHA256哈希并将其放在x-amz-content-sha256
中(如果使用旧版AWS签名V2进行身份验证,则会计算Content-MD5
)。与@Chilkat Software的评论不同,它具有在撰写此评论时尚未在更高版本中修复,因此删除是有意的。
这并不可怕,但这是由于误解,即为实现身份验证而构造有效的AWS Signature V4时必须使用内容的SHA-256哈希,而实际上并非如此。 。 SHA256虽然完全可以满足内容验证的要求,但与MD5相比,也浪费了内容验证的时间。
上载零件时,AWS C ++ SDK本身未在x-amz-content-sha256
标头中使用SHA-256哈希。我已经确认它使用了x-amz-content-sha256:UNSIGNED-PAYLOAD
,而是使用了不太“昂贵”的MD5哈希,并将其放在Content-MD5
标头中(请参见https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-header-based-auth.html的AWS文档)
无符号有效载荷选项–您包括文字字符串 构造规范请求时,请使用UNSIGNED-PAYLOAD,并设置 发送x时与x-amz-content-sha256标头值相同的值 向Amazon S3请求
这是一个使用Content-MD5进行内容验证的Amazon AWS UploadPart请求的示例,而不是使用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为我们提供了一个新的“ beta”版本,该版本甚至可以为AWS Signature V4指定Content-MD5
标头,并且不会删除它,但是,它是自动计算的SHA-256 { {1}},从而不必要地使哈希加倍,并且能够为AWS签名指定x-amz-content-sha256
会更好。
如果UNSIGNED-PAYLOAD
值存在内容不匹配错误,则AWS返回此错误(状态为400):
Content-MD5
如果与<?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将返回以下错误,我很难在网络上找到该错误,并且略有不同,因此请粘贴到此处(状态400):
x-amz-content-sha256
,
此问题应该已经在更高版本的Chilkat中得到解决。