Curl 从EC2实例下载AWS S3文件

Curl 从EC2实例下载AWS S3文件,curl,amazon-s3,amazon-ec2,Curl,Amazon S3,Amazon Ec2,我有一个从AWS S3下载文件的脚本,它可以从AWS之外的独立服务器上工作。但当我将此脚本放在EC2实例上并尝试它时,它返回错误“SignatureDesNotMatch-我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法。” 但它在另一台服务器上工作。ec2与s3主机位于同一区域。我猜这和主人有关。我尝试了这些主机/url,但它返回相同的错误 有人能用curl从ec2下载s3文件吗?我只需要用卷发。请回答,如果你知道如何通过卷曲。谢谢 $bucket/$file $bucket/

我有一个从AWS S3下载文件的脚本,它可以从AWS之外的独立服务器上工作。但当我将此脚本放在EC2实例上并尝试它时,它返回错误“SignatureDesNotMatch-我们计算的请求签名与您提供的签名不匹配。请检查您的密钥和签名方法。”

但它在另一台服务器上工作。ec2与s3主机位于同一区域。我猜这和主人有关。我尝试了这些主机/url,但它返回相同的错误


有人能用curl从ec2下载s3文件吗?我只需要用卷发。请回答,如果你知道如何通过卷曲。谢谢

$bucket/$file

$bucket/$file

https://$bucket.s3-ap-southest-1.amazonaws.com/$file

#!/bin/sh
file="file-name"
bucket="bucket-name"
resource="/${bucket}/${file}"
contentType="application/x-compressed-tar"
dateValue="`date +'%a, %d %b %Y %H:%M:%S %z'`"
stringToSign="GET\n\n${contentType}\n${dateValue}\n${resource}"
s3Key="xxxxxxxxxxxxxxxxxx"
s3Secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
signature=$(echo -en "${stringToSign}" | openssl sha1 -hmac "${s3Secret}" -binary | base64)
curl -H "Host: s3-ap-southeast-1.amazonaws.com" \
 -H "Date: $dateValue" \
 -H "Content-Type: $contentType" \
 -H "Authorization: AWS ${s3Key}:${signature}" \
 https://s3-ap-southeast-1.amazonaws.com/$bucket/$file -o $file
https://$bucket.s3.amazonaws.com/$file

#!/bin/sh
file="file-name"
bucket="bucket-name"
resource="/${bucket}/${file}"
contentType="application/x-compressed-tar"
dateValue="`date +'%a, %d %b %Y %H:%M:%S %z'`"
stringToSign="GET\n\n${contentType}\n${dateValue}\n${resource}"
s3Key="xxxxxxxxxxxxxxxxxx"
s3Secret="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
signature=$(echo -en "${stringToSign}" | openssl sha1 -hmac "${s3Secret}" -binary | base64)
curl -H "Host: s3-ap-southeast-1.amazonaws.com" \
 -H "Date: $dateValue" \
 -H "Content-Type: $contentType" \
 -H "Authorization: AWS ${s3Key}:${signature}" \
 https://s3-ap-southeast-1.amazonaws.com/$bucket/$file -o $file

<>而不是编写卷曲命令,考虑使用.< /P>
它有一个<代码> AWS S3Cp命令,可以将内容复制到Amazon S3桶中(甚至在桶之间).< /P>

,而不是编写卷曲命令,考虑使用.< /P> 它有一个

aws s3 cp
命令,可以将内容复制到Amazon s3存储桶中或从中复制内容(甚至在存储桶之间)

#!/bin/sh
S3_KEY='/file.txt'
S3_SECRET_KEY='xxx'
S3_ACCESS_KEY='AKIAxxx'
S3_HOST=yourbucket.s3.amazonaws.com

AMZ_DATE=$(date -u "+%Y%m%dT%H%M%SZ")
DATE=$(/bin/echo ${AMZ_DATE} | cut -b 1-8)
REGION=ap-southeast-1
CANONICAL_REQUEST="GET\n${S3_KEY}\n\nhost:${S3_HOST}\nx-amz-content-sha256:UNSIGNED-PAYLOAD\nx-amz-date:${AMZ_DATE}\n\nhost;x-amz-content-sha256;x-amz-date\nUNSIGNED-PAYLOAD"
STRING_TO_SIGN="AWS4-HMAC-SHA256\n${AMZ_DATE}\n${DATE}/${REGION}/s3/aws4_request\n$(/bin/echo -en ${CANONICAL_REQUEST} | sha256sum | cut -f 1 -d' ')"

AWS_SIG_V4_AND_S3_SECRET_KEY=AWS4${S3_SECRET_KEY}

DATE_HMAC_HEX=$(/bin/echo -n "${DATE}" | openssl sha256 -hmac "${AWS_SIG_V4_AND_S3_SECRET_KEY}" | cut -f 2 -d' ')
DATE_HMAC_BIN=$(/bin/echo -n "${DATE_HMAC_HEX}" | xxd -r -p)

REGION_HMAC_HEX=$(/bin/echo -n "${REGION}"  | openssl sha256 -hmac "${DATE_HMAC_BIN}" | cut -f 2 -d' ')
REGION_HMAC_BIN=$(/bin/echo -n "${REGION_HMAC_HEX}" | xxd -r -p)

SERVICE_HMAC_HEX=$(/bin/echo -n "s3"  | openssl sha256 -hmac "${REGION_HMAC_BIN}" | cut -f 2 -d' ')
SERVICE_HMAC_BIN=$(/bin/echo -n "${SERVICE_HMAC_HEX}" | xxd -r -p)

SIGNING_KEY_HEX=$(/bin/echo -n "aws4_request"  | openssl sha256 -hmac "${SERVICE_HMAC_BIN}" | cut -f 2 -d' ')
SIGNING_KEY_BIN=$(/bin/echo -n "${SIGNING_KEY_HEX}" | xxd -r -p)


SIGNATURE_HEX=$(/bin/echo -ne "${STRING_TO_SIGN}" | openssl sha256 -hmac "${SIGNING_KEY_BIN}" | cut -f 2 -d' ')

curl -vv https://${S3_HOST}/file.txt \
    -H "Host: ${S3_HOST}" \
    -H "x-amz-content-sha256: UNSIGNED-PAYLOAD" \
    -H "x-amz-date: ${AMZ_DATE}" \
    -H "Authorization: AWS4-HMAC-SHA256 Credential=${S3_ACCESS_KEY}/${DATE}/${REGION}/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=${SIGNATURE_HEX}"
这是使用AWS签名V4。 我已经测试过了,它可以在CentOS 7.3和Ubuntu LTS 16.04上运行,适用于我在ap-Southwest-1地区的bucket。 我强烈建议使用约翰·罗滕斯坦的建议。

试试这个

#!/bin/sh
S3_KEY='/file.txt'
S3_SECRET_KEY='xxx'
S3_ACCESS_KEY='AKIAxxx'
S3_HOST=yourbucket.s3.amazonaws.com

AMZ_DATE=$(date -u "+%Y%m%dT%H%M%SZ")
DATE=$(/bin/echo ${AMZ_DATE} | cut -b 1-8)
REGION=ap-southeast-1
CANONICAL_REQUEST="GET\n${S3_KEY}\n\nhost:${S3_HOST}\nx-amz-content-sha256:UNSIGNED-PAYLOAD\nx-amz-date:${AMZ_DATE}\n\nhost;x-amz-content-sha256;x-amz-date\nUNSIGNED-PAYLOAD"
STRING_TO_SIGN="AWS4-HMAC-SHA256\n${AMZ_DATE}\n${DATE}/${REGION}/s3/aws4_request\n$(/bin/echo -en ${CANONICAL_REQUEST} | sha256sum | cut -f 1 -d' ')"

AWS_SIG_V4_AND_S3_SECRET_KEY=AWS4${S3_SECRET_KEY}

DATE_HMAC_HEX=$(/bin/echo -n "${DATE}" | openssl sha256 -hmac "${AWS_SIG_V4_AND_S3_SECRET_KEY}" | cut -f 2 -d' ')
DATE_HMAC_BIN=$(/bin/echo -n "${DATE_HMAC_HEX}" | xxd -r -p)

REGION_HMAC_HEX=$(/bin/echo -n "${REGION}"  | openssl sha256 -hmac "${DATE_HMAC_BIN}" | cut -f 2 -d' ')
REGION_HMAC_BIN=$(/bin/echo -n "${REGION_HMAC_HEX}" | xxd -r -p)

SERVICE_HMAC_HEX=$(/bin/echo -n "s3"  | openssl sha256 -hmac "${REGION_HMAC_BIN}" | cut -f 2 -d' ')
SERVICE_HMAC_BIN=$(/bin/echo -n "${SERVICE_HMAC_HEX}" | xxd -r -p)

SIGNING_KEY_HEX=$(/bin/echo -n "aws4_request"  | openssl sha256 -hmac "${SERVICE_HMAC_BIN}" | cut -f 2 -d' ')
SIGNING_KEY_BIN=$(/bin/echo -n "${SIGNING_KEY_HEX}" | xxd -r -p)


SIGNATURE_HEX=$(/bin/echo -ne "${STRING_TO_SIGN}" | openssl sha256 -hmac "${SIGNING_KEY_BIN}" | cut -f 2 -d' ')

curl -vv https://${S3_HOST}/file.txt \
    -H "Host: ${S3_HOST}" \
    -H "x-amz-content-sha256: UNSIGNED-PAYLOAD" \
    -H "x-amz-date: ${AMZ_DATE}" \
    -H "Authorization: AWS4-HMAC-SHA256 Credential=${S3_ACCESS_KEY}/${DATE}/${REGION}/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date,Signature=${SIGNATURE_HEX}"
这是使用AWS签名V4。 我已经测试过了,它可以在CentOS 7.3和Ubuntu LTS 16.04上运行,适用于我在ap-Southwest-1地区的bucket。
我强烈建议使用约翰·罗滕斯坦的建议。

提提·旺萨·本·达莫尔的回答非常有用。这是一个稍微修改的版本,用于使用分配给EC2实例的IAM配置文件中的凭据。我也没有在机器上提供xxd,所以我调整了它以使用sed

#!/bin/bash

#### Variables

REGION=eu-west-2
S3_KEY='/some/file.txt'   # The file you want to download
FILENAME=$(basename $S3_KEY)
S3_HOST=yourbucket.s3.amazonaws.com # Endpoint for the S3 bucket


#### Get Temporary AWS Credentials from instance metadata ###### 

ROLE_NAME=$(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/)
CREDENTIALS_TEXT=$(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME)

S3_SECRET_KEY=$(echo $CREDENTIALS_TEXT | sed -e 's/.*SecretAccessKey" : "\(.*\)", "Token.*/\1/')
S3_ACCESS_KEY=$(echo $CREDENTIALS_TEXT | sed -e 's/.*AccessKeyId" : "\(.*\)", "SecretAccessKey.*/\1/')
TOKEN=$(echo $CREDENTIALS_TEXT | sed -e 's/.*Token" : "\(.*\)", "Expiration.*/\1/')

####################################

##### Create the string that needs signing ########

AMZ_DATE=$(date -u "+%Y%m%dT%H%M%SZ")
DATE=$(/bin/echo ${AMZ_DATE} | cut -b 1-8)

CANONICAL_REQUEST="GET\n${S3_KEY}\n\nhost:${S3_HOST}\nx-amz-content-sha256:UNSIGNED-PAYLOAD\nx-amz-date:${AMZ_DATE}\nx-amz-security-token:${TOKEN}\n\nhost;x-amz-content-sha256;x-amz-date;x-amz-security-token\nUNSIGNED-PAYLOAD"
STRING_TO_SIGN="AWS4-HMAC-SHA256\n${AMZ_DATE}\n${DATE}/${REGION}/s3/aws4_request\n$(/bin/echo -en ${CANONICAL_REQUEST} | sha256sum | cut -f 1 -d' ')"

####################################

#### Use Temporary AWS Credentials to create signing key ###### 

AWS_SIG_V4_AND_S3_SECRET_KEY=AWS4${S3_SECRET_KEY}

DATE_HMAC_HEX=$(/bin/echo -n "${DATE}" | openssl sha256 -hmac "${AWS_SIG_V4_AND_S3_SECRET_KEY}" | cut -f 2 -d' ')
DATE_HMAC_BIN=$(/bin/echo -n "${DATE_HMAC_HEX}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf)

REGION_HMAC_HEX=$(/bin/echo -n "${REGION}"  | openssl sha256 -hmac "${DATE_HMAC_BIN}" | cut -f 2 -d' ')
REGION_HMAC_BIN=$(/bin/echo -n "${REGION_HMAC_HEX}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf)

SERVICE_HMAC_HEX=$(/bin/echo -n "s3"  | openssl sha256 -hmac "${REGION_HMAC_BIN}" | cut -f 2 -d' ')
SERVICE_HMAC_BIN=$(/bin/echo -n "${SERVICE_HMAC_HEX}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf)

SIGNING_KEY_HEX=$(/bin/echo -n "aws4_request"  | openssl sha256 -hmac "${SERVICE_HMAC_BIN}" | cut -f 2 -d' ')
SIGNING_KEY_BIN=$(/bin/echo -n "${SIGNING_KEY_HEX}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf)

####################################

#### Sign string with signing key ## 

SIGNATURE_HEX=$(/bin/echo -ne "${STRING_TO_SIGN}" | openssl sha256 -hmac "${SIGNING_KEY_BIN}" | cut -f 2 -d' ')

####################################

#### Put it all together into a curl request ## 

curl https://${S3_HOST}${S3_KEY} \
    -H "Host: ${S3_HOST}" \
    -H "x-amz-content-sha256: UNSIGNED-PAYLOAD" \
    -H "x-amz-date: ${AMZ_DATE}" \
    -H "X-Amz-Security-Token: ${TOKEN}" \
    -H "Authorization: AWS4-HMAC-SHA256 Credential=${S3_ACCESS_KEY}/${DATE}/${REGION}/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;X-Amz-Security-Token,Signature=${SIGNATURE_HEX}" -o $FILENAME

####################################

Titi Wangsa bin Dammore的回答非常有用。这是一个稍微修改的版本,用于使用分配给EC2实例的IAM配置文件中的凭据。我也没有在机器上提供xxd,所以我调整了它以使用sed

#!/bin/bash

#### Variables

REGION=eu-west-2
S3_KEY='/some/file.txt'   # The file you want to download
FILENAME=$(basename $S3_KEY)
S3_HOST=yourbucket.s3.amazonaws.com # Endpoint for the S3 bucket


#### Get Temporary AWS Credentials from instance metadata ###### 

ROLE_NAME=$(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/)
CREDENTIALS_TEXT=$(curl -s http://169.254.169.254/latest/meta-data/iam/security-credentials/$ROLE_NAME)

S3_SECRET_KEY=$(echo $CREDENTIALS_TEXT | sed -e 's/.*SecretAccessKey" : "\(.*\)", "Token.*/\1/')
S3_ACCESS_KEY=$(echo $CREDENTIALS_TEXT | sed -e 's/.*AccessKeyId" : "\(.*\)", "SecretAccessKey.*/\1/')
TOKEN=$(echo $CREDENTIALS_TEXT | sed -e 's/.*Token" : "\(.*\)", "Expiration.*/\1/')

####################################

##### Create the string that needs signing ########

AMZ_DATE=$(date -u "+%Y%m%dT%H%M%SZ")
DATE=$(/bin/echo ${AMZ_DATE} | cut -b 1-8)

CANONICAL_REQUEST="GET\n${S3_KEY}\n\nhost:${S3_HOST}\nx-amz-content-sha256:UNSIGNED-PAYLOAD\nx-amz-date:${AMZ_DATE}\nx-amz-security-token:${TOKEN}\n\nhost;x-amz-content-sha256;x-amz-date;x-amz-security-token\nUNSIGNED-PAYLOAD"
STRING_TO_SIGN="AWS4-HMAC-SHA256\n${AMZ_DATE}\n${DATE}/${REGION}/s3/aws4_request\n$(/bin/echo -en ${CANONICAL_REQUEST} | sha256sum | cut -f 1 -d' ')"

####################################

#### Use Temporary AWS Credentials to create signing key ###### 

AWS_SIG_V4_AND_S3_SECRET_KEY=AWS4${S3_SECRET_KEY}

DATE_HMAC_HEX=$(/bin/echo -n "${DATE}" | openssl sha256 -hmac "${AWS_SIG_V4_AND_S3_SECRET_KEY}" | cut -f 2 -d' ')
DATE_HMAC_BIN=$(/bin/echo -n "${DATE_HMAC_HEX}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf)

REGION_HMAC_HEX=$(/bin/echo -n "${REGION}"  | openssl sha256 -hmac "${DATE_HMAC_BIN}" | cut -f 2 -d' ')
REGION_HMAC_BIN=$(/bin/echo -n "${REGION_HMAC_HEX}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf)

SERVICE_HMAC_HEX=$(/bin/echo -n "s3"  | openssl sha256 -hmac "${REGION_HMAC_BIN}" | cut -f 2 -d' ')
SERVICE_HMAC_BIN=$(/bin/echo -n "${SERVICE_HMAC_HEX}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf)

SIGNING_KEY_HEX=$(/bin/echo -n "aws4_request"  | openssl sha256 -hmac "${SERVICE_HMAC_BIN}" | cut -f 2 -d' ')
SIGNING_KEY_BIN=$(/bin/echo -n "${SIGNING_KEY_HEX}" | sed 's/\([0-9A-F]\{2\}\)/\\\\\\x\1/gI' | xargs printf)

####################################

#### Sign string with signing key ## 

SIGNATURE_HEX=$(/bin/echo -ne "${STRING_TO_SIGN}" | openssl sha256 -hmac "${SIGNING_KEY_BIN}" | cut -f 2 -d' ')

####################################

#### Put it all together into a curl request ## 

curl https://${S3_HOST}${S3_KEY} \
    -H "Host: ${S3_HOST}" \
    -H "x-amz-content-sha256: UNSIGNED-PAYLOAD" \
    -H "x-amz-date: ${AMZ_DATE}" \
    -H "X-Amz-Security-Token: ${TOKEN}" \
    -H "Authorization: AWS4-HMAC-SHA256 Credential=${S3_ACCESS_KEY}/${DATE}/${REGION}/s3/aws4_request,SignedHeaders=host;x-amz-content-sha256;x-amz-date;X-Amz-Security-Token,Signature=${SIGNATURE_HEX}" -o $FILENAME

####################################

你好我知道还有其他选择,但正如我提到的,我需要使用curl,所以我希望能回答我的问题。我正在使用自动缩放,所以我已经创建了图像,所有区域都有很多工作要做,以设置CLI。我已经运行了chef,因此我可以通过cookbook加载一些bash代码来运行下载,而无需更新图像。如果您知道如何通过curl执行,请回答,而不是建议其他选项。谢谢,你好。我知道还有其他选择,但正如我提到的,我需要使用curl,所以我希望能回答我的问题。我正在使用自动缩放,所以我已经创建了图像,所有区域都有很多工作要做,以设置CLI。我已经运行了chef,因此我可以通过cookbook加载一些bash代码来运行下载,而无需更新图像。如果您知道如何通过curl执行,请回答,而不是建议其他选项。谢谢,可能与OpenSSL中的一个bug有关,因为它是通过升级OpenSSL解决的。不幸的是,旧版本无法识别,因此根本原因从未确定。也许比较两台机器上的OpenSSL版本会是您的一个起点。嗨,Michael,我刚刚尝试了更高版本的OpenSSL。在aws之外工作的服务器中的服务器在2013年2月11日具有OpenSSL 1.0.1e-fips,现在aws服务器在2016年9月26日具有OpenSSL 1.0.2j,但它仍然返回SignatureDesNotMatch。我想知道是否可能是我没有使用正确的主机或url?似乎我上面的代码适用于centos。我尝试了另一个ubuntu服务器,但它不工作。也许不知何故,生成签名的行在ubuntu中没有得到正确处理。我尝试了最新的openssl版本,但似乎仍然不起作用/bin/sh至
#/bin/bash
。ubuntu使用与centos echo不同的echo-en${stringToSign}从字面上打印出虚线空格en space G e T slash n…,可能与OpenSSL中的一个错误有关,因为它是通过升级OpenSSL解决的。不幸的是,旧版本无法识别,因此根本原因从未确定。也许比较两台机器上的OpenSSL版本会是您的一个起点。嗨,Michael,我刚刚尝试了更高版本的OpenSSL。在aws之外工作的服务器中的服务器在2013年2月11日具有OpenSSL 1.0.1e-fips,现在aws服务器在2016年9月26日具有OpenSSL 1.0.2j,但它仍然返回SignatureDesNotMatch。我想知道是否可能是我没有使用正确的主机或url?似乎我上面的代码适用于centos。我尝试了另一个ubuntu服务器,但它不工作。也许不知何故,生成签名的行在ubuntu中没有得到正确处理。我尝试了最新的openssl版本,但似乎仍然不起作用/bin/sh至
#/bin/bash
。ubuntu使用与centos echo不同的echo-en${stringToSign}从字面上打印出虚线空格e n空格G e T斜线n…很有趣。我用这个脚本做了一些测试,它有几分钟停止工作(返回403-禁止)。然后你必须等一段时间再试一次。很有趣。我用这个脚本做了一些测试,它有几分钟停止工作(返回403-禁止)。那你得等一会儿再试一次。我已经试了好几个小时了。谢谢你。我遵循aws文件,不知道什么不起作用。显然,我遗漏了两件事:我使用了空字符串的散列而不是
无符号有效载荷
,并且在生成签名密钥时,我没有转换为二进制。这些步骤显然是必要的,docsAny idea中没有提到,为什么有时它返回403,而我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法?我一直在尝试获取此信息