В этой ситуации есть две уникальные проблемы:
- Использование несистемных свойств для предоставления материала шифрования
- Переключение (и создание, если необходимо) учетных данных для каждого запроса.
Следующий план решения решит обе проблемы. Вместо этого он использует StaticEncryptionMaterialsProvider, чтобы избежать зависимости от свойств системы. чтобы решить вторую проблему, S3ClientResolver использует область REQUEST с proxyMode как TARGET_CLASS, чтобы обеспечить правильную работу проводки в контексте Spring в этом случае. .yml, как показано ниже
teams:
one:
awsId: abc
awsKey: abc
endpoint: https://example.com
keystorePD: onejskpass
jksFile: one.jks
two:
awsId: abc2
awsKey: abc2
endpoint: https://example.com
keystorePD: twojskpass
jksFile: two.jks
После этого ваш код будет выглядеть следующим образом
@Autowired
private S3ClientResolver resolver;
public void uploadFile(File file, String targetLocation, String bucketName) {
log.info("converted file size : " + file.getTotalSpace());
log.info("bucketName : " + bucketName);
log.info("targetLocation : " + targetLocation);
resolver.getClient().putObject(bucketName, targetLocation, file);
}
Пожалуйста, настройте его в соответствии с вашими собственными средами. Я быстро извлек эти фрагменты из одной из своих прошлых аналогичных работ. Я оставил многие элементы в приведенном выше фрагменте в качестве комментариев. Пожалуйста, заполните go и настройте его в соответствии с вашими вариантами использования.
[Edit - 15 июля 2020]
jackfr0st, logi c генерации ключевой пары работает, я только что проверил это с следующая автономная программа, которая является точной копией того, что упомянуто выше, с исправлением оператора return (который отсутствовал ранее) в строке new KeyPair(publicKey, (PrivateKey) key)
- для этой цели я создал fre sh keystore (testjks.jks), используя следующую команду - keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -keysize 2048
import java.io.FileInputStream;
import java.security.*;
import java.security.cert.Certificate;
public class ExtractKeypair {
public static void main(String[] args) throws Exception {
KeyPair kp = generateKeypair("testjks.jks");
}
public static KeyPair generateKeypair(String file) throws Exception {
FileInputStream is = new FileInputStream(Thread.currentThread().getContextClassLoader()
.getResource(file).getFile());
KeyStore keystore = KeyStore.getInstance("jks");
keystore.load(is, "password".toCharArray());
// the only key in your JKS must have this alias
// you may also add the alias as another property in your configuration instead
String alias = "mydomain";
Key key = keystore.getKey(alias, "password".toCharArray());
if (key instanceof PrivateKey) {
Certificate cert = keystore.getCertificate(alias);
PublicKey publicKey = cert.getPublicKey();
return new KeyPair(publicKey, (PrivateKey) key);
}
throw new RuntimeException("Invalid key");
}
}
Если вы все еще сталкиваетесь с проблемой, я предлагаю посмотреть на возвращенный ресурс (Thread.currentThread().getContextClassLoader().getResource(file).getFile()
), так как это единственная переменная, которая может вызвать проблему, если она неверна. Я тестировал вышеуказанную программу с помощью oracle jdk 8.