[英]Ceph/Rados AWS S3 API Bucket Policy via CURL
我目前正在努力解决 rest 调用由 rados/ceph 网关托管的 AWS s3 API 时遇到的问题。
由于我不会 go 进入的原因,我不能使用提供的 SDK 与之交谈,这将解决我的所有问题 - 我正在通过 ZA8BC9234D0898480674A 重新创建我需要的一些更简单的工作工作,我可以制作存储桶,删除它们,添加对象,创建角色,但我最新的问题是存储桶策略,包括GET
和PUT
。 我每次都收到 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.