Спасибо @ паван
Любой клиент, которому необходимо использовать SSE-C, должен иметь возможность отправки заголовков ниже.
При использовании предварительно назначенного URL-адреса для извлечения существующего объекта или извлечения только метаданных объекта нам необходимо предоставить все заголовки шифрования в вашем клиентском приложении.
Для шифрования на стороне сервера под управлением S3 или KMS мы можем сгенерировать предварительно заданный URL-адрес и напрямую вставить его в браузер или проигрыватель.
Однако это не относится к объектам SSE-C, поскольку в дополнение к
предварительно назначенный URL, вы также должны включить заголовки HTTP, которые
специфичные для объектов SSE-C. Таким образом, вы можете использовать предопределенный URL
для объектов SSE-C только программно.
Загрузить:
Я выбрал управляемые ключи S3 вместо предоставленного клиентом клиентского ключа.
FileInputStream fin = new FileInputStream(uploadFileName);
byte fileContent[] = new byte[(int) uploadFileName.length()];
// Reads up to certain bytes of data from this input stream into an array of
// bytes.
fin.read(fileContent);
// create string from byte array
// Specify server-side encryption.
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentLength(fileContent.length);
objectMetadata.setSSEAlgorithm(ObjectMetadata.AES_256_SERVER_SIDE_ENCRYPTION);
PutObjectRequest putRequest = new PutObjectRequest(bucketName, keyName,
new ByteArrayInputStream(fileContent), objectMetadata);
// Upload the object and check its encryption status.
PutObjectResult putResult = s3Client.putObject(putRequest);
System.out.println("Object \"" + keyName + "\" uploaded with SSE.");
GET Presigned URL:
java.util.Date expiration = new java.util.Date();
long expTimeMillis = expiration.getTime();
expTimeMillis += 1000 * 60 * 60;
expiration.setTime(expTimeMillis);
System.out.println("Generating pre-signed URL.");
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, keyName)
.withMethod(HttpMethod.GET).withExpiration(expiration);
URL url = s3Client.generatePresignedUrl(generatePresignedUrlRequest);
System.out.println("Pre-Signed URL: " + url.toURI());
Ссылка:
https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html