Saltar al contenido

Subir a Amazon S3 mediante cURL / libcurl

Solución:

Podría ejecutar un archivo bash. Aquí hay un ejemplo upload.sh script que podría ejecutar como: sh upload.sh yourfile

#!/bin/bash
file=$1
bucket=YOUR_BUCKET
resource="/${bucket}/${file}"
contentType="application/x-itunes-ipa"
dateValue=`date -R`
stringToSign="PUTnn${contentType}n${dateValue}n${resource}"
s3Key=YOUR_KEY_HERE
s3Secret=YOUR_SECRET
echo "SENDING TO S3"
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64` 
curl -vv -X PUT -T "${file}" 
 -H "Host: ${bucket}.s3.amazonaws.com" 
 -H "Date: ${dateValue}" 
 -H "Content-Type: ${contentType}" 
 -H "Authorization: AWS ${s3Key}:${signature}" 
 https://${bucket}.s3.amazonaws.com/${file}

más en: http://www.jamesransom.net/?p=58

http://www.jamesransom.net/?p=58

El juego cambió significativamente desde que se hizo la pregunta, los encabezados de autorización simple ya no se aplican, pero aún es factible realizarlo con un script de shell de UNIX, como se indica a continuación.

Asegúrese de que ‘openssl’ y ‘curl’ estén disponibles en la línea de comando.

Tenga cuidado, un solo carácter de nueva línea o espacio adicional, de lo contrario, el uso de CRLF en lugar del carácter NewLine solo anularía la firma. Tenga en cuenta también que es posible que desee utilizar tipos de contenido posiblemente con codificaciones para evitar cualquier transformación de datos a través de los medios de comunicación. A continuación, puede que tenga que ajustar la lista de encabezados firmados en varios lugares; Consulte los documentos de la API de AMAZON S3 para conocer las numerosas convenciones que se deben cumplir, como el orden alfabético en minúsculas de la información del encabezado utilizada en los cálculos hash en varios lugares (redundantes).

# BERHAUZ Nov 2019 - curl script for file upload to Amazon S3 Buckets
test -n "$1" || {
  echo "usage: $0 <myFileToSend.txt>"
  echo "... missing argument file ..."
  exit
}
yyyymmdd=`date +%Y%m%d`
isoDate=`date --utc +%Y%m%dT%H%M%SZ`
# EDIT the next 4 variables to match your account
s3Bucket="myBucket.name.here"
bucketLocation="eu-central-1" 
s3AccessKey="THISISMYACCESSKEY123"
s3SecretKey="ThisIsMySecretKeyABCD1234efgh5678"

#endpoint="${s3Bucket}.s3-${bucketLocation}.amazonaws.com"
endpoint="s3-${bucketLocation}.amazonaws.com"

fileName="$1"
contentLength=`cat ${fileName} | wc -c`
contentHash=`openssl sha -sha256 -hex ${fileName} | sed 's/.* //'`

canonicalRequest="PUTn/${s3Bucket}/${fileName}nncontent-length:${contentLength}nhost:${endpoint}nx-amz-content-sha256:${contentHash}nx-amz-date:${isoDate}nncontent-length;host;x-amz-content-sha256;x-amz-daten${contentHash}"
canonicalRequestHash=`echo -en ${canonicalRequest} | openssl sha -sha256 -hex | sed 's/.* //'`

stringToSign="AWS4-HMAC-SHA256n${isoDate}n${yyyymmdd}/${bucketLocation}/s3/aws4_requestn${canonicalRequestHash}"

echo "----------------- canonicalRequest --------------------"
echo -e ${canonicalRequest}
echo "----------------- stringToSign --------------------"
echo -e ${stringToSign}
echo "-------------------------------------------------------"

# calculate the signing key
DateKey=`echo -n "${yyyymmdd}" | openssl sha -sha256 -hex -hmac "AWS4${s3SecretKey}" | sed 's/.* //'`
DateRegionKey=`echo -n "${bucketLocation}" | openssl sha -sha256 -hex -mac HMAC -macopt hexkey:${DateKey} | sed 's/.* //'`
DateRegionServiceKey=`echo -n "s3" | openssl sha -sha256 -hex -mac HMAC -macopt hexkey:${DateRegionKey} | sed 's/.* //'`
SigningKey=`echo -n "aws4_request" | openssl sha -sha256 -hex -mac HMAC -macopt hexkey:${DateRegionServiceKey} | sed 's/.* //'`
# then, once more a HMAC for the signature
signature=`echo -en ${stringToSign} | openssl sha -sha256 -hex -mac HMAC -macopt hexkey:${SigningKey} | sed 's/.* //'`

authoriz="Authorization: AWS4-HMAC-SHA256 Credential=${s3AccessKey}/${yyyymmdd}/${bucketLocation}/s3/aws4_request, SignedHeaders=content-length;host;x-amz-content-sha256;x-amz-date, Signature=${signature}"

curl -v -X PUT -T "${fileName}" 
-H "Host: ${endpoint}" 
-H "Content-Length: ${contentLength}" 
-H "x-amz-date: ${isoDate}" 
-H "x-amz-content-sha256: ${contentHash}" 
-H "${authoriz}" 
http://${endpoint}/${s3Bucket}/${fileName}

Debo reconocer que, para alguien un poco involucrado en la criptografía como yo, el esquema de firma de Amazon merece numerosas críticas:

  • hay mucha redundancia en la información que se firma,
  • La cascada de HMAC de 5 pasos casi invierte la semántica entre la semilla clave y los datos, donde 1 paso sería suficiente con un uso adecuado y la misma seguridad.
  • los últimos 12 caracteres de la clave secreta son inútiles aquí, porque la longitud significativa de la clave de un HMAC SHA256 es … 256 bits, por lo tanto, 32 bytes, de los cuales los primeros 4 siempre comienzan con “AWS4” sin ningún propósito.
  • La API general de AWS S3 reinventa los estándares donde una carga útil S / MIME hubiera funcionado

Pido disculpas por las críticas, no pude resistir. Sin embargo, reconozca: funciona de manera confiable, es útil para muchas empresas y es un servicio interesante con una API rica.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *