Es un poco extraño para mí, este no es un tema discutido todavía, pero estoy trabajando con un servidor de almacenamiento AWS S3 que intenta implementar el cifrado del lado del servidor utilizando la opción de una clave proporcionada por el cliente (SSE-C).
Más información aquí: enlace
El método de cifrado funciona bien cuando intento utilizar el Servicio de administración de claves (KMS) de AWS. El problema que tengo personalmente es que quiero mantener las teclas, lo que me lleva a querer el método SSE-C.
La documentación para PHP (por cualquier motivo) es escasa en este tema, pero he logrado que funcione utilizando la compilación aparentemente más reciente de la versión 3 para S3.
Mi código de conexión y el objeto puesto en el sistema es el siguiente. Los archivos se cargan correctamente en el sistema. El código es el siguiente:
//connect is successful
$client = Aws\S3\S3Client::factory([
'version' => "2006-03-01",
'region' => "us-west-1",
'credentials' => [
'key' => "mykey",
'secret' => "mysecret"
]
]);
//upload is successful
$somerandom32bitkey="48wk86271sDb23pY23zT5rZJ7q55R7eE";
$result = $client->putObject([
'Bucket' => 'mybucketname',
'Key' => 'myfilename',
'Body' => 'some body of the file',
'SSECustomerAlgorithm' => 'AES256',
'SSECustomerKey' => $somerandom32bitkey,
'SSECustomerKeyMD5' => md5($somerandom32bitkey,true),
]);
Mi problema surge cuando intento obtener una url previamente firmada. Parece que no puedo encontrar ninguna documentación sobre cómo hacer esta parte, lo cual es bastante importante. El código es el siguiente:
$somerandom32bitkey="48wk86271sDb23pY23zT5rZJ7q55R7eE";
$cmd = $client->getCommand('GetObject', array(
'Bucket' => 'mybucketname',
'Key' => 'myfilename',
'SSECustomerAlgorithm' => 'AES256',
'SSECustomerKey' => $somerandom32bitkey,
'SSECustomerKeyMD5' => md5($somerandom32bitkey,true),
));
$request = $client->createPresignedRequest($cmd, '+10 minutes');
$presignedUrl = (string) $request->getUri();
El enlace generado tiene este aspecto:
La respuesta del resultado a través de AWS es:
<Error>
<Code>InvalidArgument</Code>
<Message>
Requests specifying Server Side Encryption with Customer provided keys must provide an appropriate secret key.
</Message>
<ArgumentName>x-amz-server-side-encryption</ArgumentName>
<ArgumentValue>null</ArgumentValue>
<RequestId>933237342E36A1D1</RequestId>
<HostId>
3XmQM+IEGdZUZ5GUnSpTpatksKIN2zb3pCiu8D7Btm09nLxKkfEAkfY8a8T8kcB3lW1p38ic3ZE=
</HostId>
</Error>
La parte interesante es que está buscando un parámetro de: 'ServerSideEncryption' = > 'AES256' pero esto es solo un parámetro requerido cuando se usa el sistema de claves administradas de AWS (SSE-KMS)
¿Alguna idea aquí?