繁体   English   中英

Ceph/Rados AWS S3 API 存储桶策略通过 CURL

[英]Ceph/Rados AWS S3 API Bucket Policy via CURL

我目前正在努力解决 rest 调用由 rados/ceph 网关托管的 AWS s3 API 时遇到的问题。

由于我不会 go 进入的原因,我不能使用提供的 SDK 与之交谈,这将解决我的所有问题 - 我正在通过 ZA8BC9234D0898480674A 重新创建我需要的一些更简单的工作工作,我可以制作存储桶,删除它们,添加对象,创建角色,但我最新的问题是存储桶策略,包括GETPUT 我每次都收到 403,但我不知道为什么。

我试图做的是使用另一个带有 SDK 的盒子,它与 API (boto3) 和 AWS s3API 调用来做同样的事情,它们与用户访问和密钥一起工作得很好,所以我不认为它一个帐户的东西。

使用来自 SDK 作业的日志,我尝试重新创建正在发送的所有内容、标头、有效负载等...

现在我只能认为 403 可能是 Auth4 策略,但是....这个策略适用于我需要做的所有其他工作。

代码:

#!/bin/bash
set -x
ACCESS_KEY="accesskey"
SECRET_KEY="secret"
SERVICE="s3"
REGION="default"
ENDPOINT="s3-test.example.com"
BUCKET="bucketname"
PATH="?policy"
TIMEDATE="$(date -u '+%Y%m%d')"
TIMEDATEISO="${TIMEDATE}T$(date -u '+%H%M%S')Z"

# Create sha256 hash in hex
function hash_sha256 {
  printf "${1}" | openssl dgst -sha256 | sed 's/^.* //'
}

# Create sha256 hmac in hex
function hmac_sha256 {
  printf "{2}" | openssl dgst -sha256 -mac HMAC -macopt "${1}" | sed 's/^.* //'
}

PAYLOAD="$(printf "" | openssl dgst -sha256 |  sed 's/^.* //')"
CANONICAL_URI="/${BUCKET}${PATH}"
CANONICAL_HEADERS="host:${ENDPOINT}
x-amz-content-sha256:${PAYLOAD}
x-amz-date:${TIMEDATEISO}"

SIGNED_HEADERS="host;x-amz-content-sha256;x-amz-date"
CANONICAL_REQUEST="GET
${CANONICAL_URI}\n
${CANONICAL_HEADERS}\n
${SIGNED_HEADERS}\n
${PAYLOAD}"

# Create signature
function create_signature {
  stringToSign="AWS4-HMAC-SHA256\n${TIMEDATEISO}\n${TIMEDATE}/${REGION}/${SERVICE}/aws_request\n$(hash_sha256 "${CANONICAL_REQUEST}")"
  dateKey=$(hmac_sha256 key:"AWS4${SECRET_KEY}" "${TIMEDATE}")
  regionKey=$(hmac_sha256 hexkey:"${dateKey}" "${REGION}")
  serviceKey=$(hmac_sha256 hexkey:"${regionKey}" "${SERVICE}")
  signingKey=$(hmac_sha256 hexkey:"${serviceKey}" "aws4_request")

  printf "${stringToSign}" | openssl dgst -sha256 -mac HMAC -macopt hexkey:"${signingKey}" |  sed 's/(stdin)= //'
}

SIGNATURE="${create_signature}"
AUTH_HEADER="\
AWS4-HMAC-SHA256 Credential=${ACCESS_KEY}/${TIMEDATE}/\
${REGION}/${SERVICE}/aws4_request, \
SignedHeaders=${SIGNED_HEADERS}, Signature=${SIGNATURE}"

curl -vvv "https://${ENDPOINT}${CANONICAL_URI}" \
    -H "Accept:" \
    -H "Authorization: ${AUTH_HEADER}" \
    -H "x-amz-content-sha256: ${PAYLOAD}" \
    -H "x-amz-date: ${TIMEDATEISO}" \

任何帮助或指示将不胜感激 - 必须手动转置,所以如果有明显的错字......我会修复并重新运行。

正如我所说,很想使用 SDK 但从我将用来执行这些请求的设备中,这是不可能的

设法解决了我自己的问题。 在 ceph 日志中注意到(不知道我第一次是如何错过的)我的客户的签名与 ceph radosgw 签署相同签名的方式不匹配。

把它带回canonicalRequest上的任务,由于某种原因,如果我取出所有换行符(\ n),它会计算......但是我所有的其他工作,比如更新角色、添加存储桶等......都失败了,因为他们需要换行符。 不知道为什么,一些 Ceph 奇怪的东西?

我进行了数据包捕获并剥离了 SSL 以查看来自工作 SDK 和我的 curl 的两个请求都在发送什么,并且它是相同的......

哦,好吧,工作:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM