Ceph/Rados AWS S3 API 通过 CURL 的存储桶策略
Ceph/Rados AWS S3 API Bucket Policy via CURL
我目前正在努力解决对由 rados/ceph 网关托管的 AWS s3 API 进行休息调用时遇到的问题。
由于我不想深入的原因,我无法使用提供的 SDK 与之对话,这将解决我所有的问题 - 我正在通过 CURL 重新创建一些我需要的更简单的工作 -在大多数情况下,我可以创建存储桶、删除它们、添加 objects、创建角色,但我最新的问题是存储桶策略,它们的 GET
和 PUT
。我每次都收到 403,我不知道为什么。
我试图做的是使用另一个带有 SDK 的盒子与 API (boto3) 和 AWS s3API 调用来做同样的事情并且它们工作得很好与用户访问和密钥,所以我不认为它是一个帐户的事情。
使用 SDK 作业的日志,我尝试重新创建正在发送的所有内容,headers、有效负载等...
现在我只能认为作为 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 "" | openssl dgst -sha256 | sed 's/^.* //'
}
# Create sha256 hmac in hex
function hmac_sha256 {
printf "{2}" | openssl dgst -sha256 -mac HMAC -macopt "" | 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 的请求都发送了什么,它们是相同的...
哦,好的,工作:)
我目前正在努力解决对由 rados/ceph 网关托管的 AWS s3 API 进行休息调用时遇到的问题。
由于我不想深入的原因,我无法使用提供的 SDK 与之对话,这将解决我所有的问题 - 我正在通过 CURL 重新创建一些我需要的更简单的工作 -在大多数情况下,我可以创建存储桶、删除它们、添加 objects、创建角色,但我最新的问题是存储桶策略,它们的 GET
和 PUT
。我每次都收到 403,我不知道为什么。
我试图做的是使用另一个带有 SDK 的盒子与 API (boto3) 和 AWS s3API 调用来做同样的事情并且它们工作得很好与用户访问和密钥,所以我不认为它是一个帐户的事情。
使用 SDK 作业的日志,我尝试重新创建正在发送的所有内容,headers、有效负载等...
现在我只能认为作为 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 "" | openssl dgst -sha256 | sed 's/^.* //'
}
# Create sha256 hmac in hex
function hmac_sha256 {
printf "{2}" | openssl dgst -sha256 -mac HMAC -macopt "" | 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 的请求都发送了什么,它们是相同的...
哦,好的,工作:)