Я использовал шифрование на стороне клиента для своей корзины s3. Я использую его с java пружинной загрузкой. Вот мой код конфигурации s3 bucket:
@Bean
public AmazonS3 s3client() throws Exception {
BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsId, awsKey);
KeyGenerator symKeyGenerator = KeyGenerator.getInstance("AES");
symKeyGenerator.init(256);
SecretKey symKey = symKeyGenerator.generateKey();
saveSymmetricKey(masterKeyDir, masterKeyName, symKey);
symKey = loadSymmetricAESKey(masterKeyDir, masterKeyName, "AES");
AmazonS3 s3EncryptionClient = null;
try{
EncryptionMaterials encryptionMaterials = new EncryptionMaterials(symKey);
s3EncryptionClient = AmazonS3EncryptionClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
.withEncryptionMaterials(new StaticEncryptionMaterialsProvider(encryptionMaterials))
.withRegion(region)
.build();
}catch (Exception e){
e.printStackTrace();
}
return s3EncryptionClient;}
Вот мой класс обслуживания:
public void saveFile(MultipartFile file) throws NoSuchAlgorithmException, IOException {
try {
File convFile = convertMultiPartToFile(file);
logger.info("===================== Upload start =====================");
s3client.putObject(new PutObjectRequest(bucketName, file.getOriginalFilename(), FileUtils.openInputStream(convFile), new ObjectMetadata()));
logger.info("===================== Upload File - Done! =====================");
} catch (AmazonServiceException ase) {
logger.info("Caught an AmazonServiceException from PUT requests, rejected reasons:");
logger.info("Error Message: " + ase.getMessage());
logger.info("HTTP Status Code: " + ase.getStatusCode());
logger.info("AWS Error Code: " + ase.getErrorCode());
logger.info("Error Type: " + ase.getErrorType());
logger.info("Request ID: " + ase.getRequestId());
ase.printStackTrace();
} catch (AmazonClientException ace) {
logger.info("Caught an AmazonClientException: ");
logger.info("Error Message: " + ace.getMessage());
ace.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void downloadFile() {
java.util.Date expiration = new java.util.Date();
long expTimeMillis = expiration.getTime();
expTimeMillis += 1000*60*60;
expiration.setTime(expTimeMillis);
GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest(bucketName, objectKey).withMethod(HttpMethod.GET).withExpiration(expiration);
URL url = s3client.generatePresignedUrl(generatePresignedUrlRequest);
System.out.println(url.toString());
}
Это ошибка, которую я получаю, когда открываю загруженный файл, используя предварительно подписанный URL:
Не удалось загрузить изображение. Ошибка при интерпретации файла изображения JPEG.