object-storageibm-cloud-storage

How to calculate md5-content header in unix shell?


I am looking for the unix command(s) to calculate md5-content header to be used with IBM Cloud Object Storage API for deletion of multiple objects. I tried echo “request body….” | md5 | base64, however API response is - `

The Content-MD5 you specified was an invalid.

Curl CMD:

curl \
  -H "Content-Type: text/plain;charset=utf-8" \
  -H "Content-MD5: 75ff06f81643655397a5911ddc195ce8" \
  -H "Authorization: $AuthToken" \
  "https://<cos-endpoint-name>/<bucket-name>?delete" \
  -d 'xml body...'

Error Response:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Error>
    <Code>InvalidDigest</Code>
    <Message>The Content-MD5 you specified was an invalid.</Message>
    <Resource>/ghhsa-bucket-etl-dev/</Resource>
    <RequestId>aed25243-22a1-477d-9ab8-b87780625a61</RequestId>
    <httpStatusCode>400</httpStatusCode>
</Error>

Appreciate any pointers on this.


Solution

  • The md5 builtin is kinda weak, it's a bit more straightforward using openssl for encryption if possible. Using an example from the docs:

    echo -n '<?xml version="1.0" encoding="UTF-8"?><Delete><Object><Key>pasture/cow-one</Key></Object><Object><Key>pasture/cow-two</Key></Object></Delete>' | openssl dgst -md5 -binary | openssl enc -base64
    

    This returns /Gx4aOgplRXMRI2qXXqXiQ== which is what we'd expect.