Cifrado del lado del servidor AWS S3 - Claves proporcionadas por el cliente PHP

0

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:

enlace

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í?

    
pregunta codin 20.01.2016 - 05:08
fuente

1 respuesta

1

Según documentación oficial hay tres requisitos de encabezado de solicitud para SSE con cliente proporcionado clave:

  1. x-amz-server-side-encryption -customer-algor: AES256
  2. x-amz-server-side-encryption -customer-key: base64 (secretkey)
  3. x-amz-server-side-encryption -customer-key-MD5: base64 (md5 (secreto clave))

Por favor actualice el código como se indica arriba

  1. 'SSECustomerAlgorithm' = > 'AES256',
  2. 'SSECustomerKey' = > base64 ($ somerandom32bitkey)
  3. 'SSECustomerKeyMD5 = > md5 (base64 ($ somerandom32bitkey))

Espero que esto ayude.

    
respondido por el mcacorner 04.10.2016 - 08:16
fuente

Lea otras preguntas en las etiquetas