【问题标题】:CkRest.AddHeader function does not add a header using Chilkat C++ ("Content-MD5" header using fullRequestBinary PUT)CkRest.AddHeader 函数不使用 Chilkat C++ 添加标头(“Content-MD5”标头使用 fullRequestBinary PUT)
【发布时间】:2021-01-08 00:56:06
【问题描述】:

我们正在使用 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 上传中“部分”的上传)并且在每次尝试中, “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

【问题讨论】:

    标签: amazon-s3 chilkat


    【解决方案1】:

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

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

    上传部件时,AWS C++ 开发工具包本身不会在 x-amz-content-sha256 标头中使用 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 构造规范请求时,并设置 发送时与 x-amz-content-sha256 标头值相同的值 对 Amazon S3 的请求

    以下是使用 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 为我们提供了一个新的“测试版”版本,它允许我们为 AWS Signature V4 指定 Content-MD5 标头,但它不会删除它,但是,它是自动计算的 SHA-256 x-amz-content-sha256 的补充所以这会不必要地加倍散列,最好能够为 AWS 签名指定 UNSIGNED-PAYLOAD

    如果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-sha256 存在内容不匹配,AWS 会返回以下错误,我在网上很难找到,并且略有不同,因此在此处粘贴(也是状态 400):

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

    【讨论】:

      【解决方案2】:

      这个问题应该已经在更高版本的 Chilkat 中修复了。

      【讨论】:

        猜你喜欢
        • 2014-03-09
        • 1970-01-01
        • 2013-09-08
        • 2011-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-11
        • 2013-07-22
        相关资源
        最近更新 更多