Por alguna razón, estoy luchando con la generación de firmas para mi política de carga de Amazon S3. Juro que lo hice funcionar en un punto pero ya no. Cualquier ayuda sería muy apreciada. Necesito un nuevo par de ojos.Política de Amazon S3 Firma en Java
Al comparar con la salida de Amazon S3 Signature Tester, soy no obteniendo la misma firma. Sin embargo, cuando uso directamente la firma que sale de esa herramienta, todo funciona bien. Entonces, definitivamente, el problema está en mi proceso de firma. Además, el descifrado hexadecimal "Cadena a ser firmado" que sale de esa herramienta es idéntico a la firma de mi política de entrada.
Los documentos dicen AWS the process for constructing a policy signature debe ir como esto:
- Codificar la política con UTF-8.
- Codifique esos bytes UTF-8 utilizando Base64.
- Firme la política con su clave de acceso secreta utilizando HMAC SHA-1.
- Codifique la firma SHA-1 utilizando Base64.
Parece bastante sencillo. El único lugar para la ambigüedad podría estar en el n. ° 3. Los documentos de AWS muestran a sample snippet for generating HMAC-SHA1 y esto es coherente con other Java cryptography examples que he visto.
Estoy usando v1.6 de Apache Commons implementación de Base64. Mi firma de código, básicamente, es el siguiente:
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;
/* ... */
private static final String UTF8 = "UTF-8";
private static final String HMACSHA1 = "HmacSHA1";
public static String sign(String secret, String data) {
byte[] dataBytes = data.getBytes(UTF8);
byte[] secretBytes = secret.getBytes(UTF8);
SecretKeySpec signingKey = new SecretKeySpec(secretBytes, HMACSHA1);
Mac mac = Mac.getInstance(HMACSHA1);
mac.init(signingKey);
byte[] signature = mac.doFinal(dataBytes);
return Base64.encodeBase64String(signature);
}
Y entonces mi uso de esta firma se parece a:
String signature = sign(
/* AWS Secret Access Key copied directly out of the AWS Console */,
/* policy properly serialized as JSON */);