Amazon Secrets Manager, Java 7 и CipherSuites

Я пытаюсь заставить AWS Secrets Manager работать на более старой платформе Java 7. К сожалению, пока что мы заблокированы на Java 7.

У меня проблема в том, что у Java 7 были некоторые проблемы с безопасностью с SSL, и большинство современных платформ Java используют более новые cipherSuites. Таким образом я получаю ошибку

javax.net.ssl.SSLHandshakeException: нет оборотного набора шифров

В других интерфейсах мне удалось решить проблему, выполнив .setEnabledCipherSuites в сокете SSL.

Проблема здесь в том, что клиент Secrets Manager не предоставляет ни сокета (AFAICT), ни SocketFactory. Я пытался создать новый SSLContext, обертывающий стандартный SSLContext, который предоставит настраиваемый SocketFactory, но создание и установка настраиваемого SSLContext оказалось довольно сложным.

Есть ли более простой способ сделать это, прежде чем я выдерну оставшуюся часть волос?

AWS Secrets Manager незаметно использует HTTP-клиент Apache (httpclient-4.5.7). Есть ли статический способ подключения клиента Apache к пользовательскому Socket, SocketFactory или SSLContext? Тот, который не требует доступа к объекту HTTPClient (который также не отображается).


person wdtj    schedule 17.06.2019    source источник
comment
Вы должны включить вывод отладки ssl, чтобы видеть, какие шифровальные наборы отправляются. И убедитесь, что у вас установлены файлы политики юрисдикции JCE Unlimited Strength.   -  person President James K. Polk    schedule 18.06.2019
comment
Мы это сделали. JCE Unlimited Strength недостаточно, вы также должны активировать люксы на уровне программы. Если есть способ включить их извне программы, я его не нашел.   -  person wdtj    schedule 18.06.2019
comment
В частности, для https существуют системные свойства, которые вы можете установить из командной строки java vm, см. настройка JSSE. Однако Java 7 должна поддерживать современные шифрокомплекты.   -  person President James K. Polk    schedule 18.06.2019
comment
Пробовал https.cipherSuites и системное свойство https.protocols, я думаю, вы дошли. Похоже, что они зависят от реализации http-клиента. AWS Secrets Manager использует HTTP-клиент Apache (httpclient-4.5.7), похоже, не использует их.   -  person wdtj    schedule 10.07.2019


Ответы (1)


После долгой тряски я придумал следующий код:

final String ciphers[] =
    { "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
        "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA", "TLS_RSA_WITH_AES_128_CBC_SHA256",
        "TLS_RSA_WITH_AES_256_CBC_SHA256" };

final String[] protocols = new String[]
    { "TLSv1.2" };

// create and initialize an SSLContext for a custom socket factory
final SSLContext sslcontext = SSLContext.getInstance("SSL");
sslcontext.init(null, null, new SecureRandom());

// and here's our SocketFactory
final SSLConnectionSocketFactory secureSocketFactory = new SSLConnectionSocketFactory(sslcontext, protocols,
        ciphers, new DefaultHostnameVerifier());

// Create a custom AWS Client Configuration with our socket factory
final ClientConfiguration cc = new ClientConfiguration();
final ApacheHttpClientConfig acc = cc.getApacheHttpClientConfig();
acc.setSslSocketFactory(secureSocketFactory);

// Create a Secrets Manager client with our custom AWS Client Configuration
final AWSSecretsManager client = AWSSecretsManagerClientBuilder //
        .standard() //
        .withRegion(region) //
        .withClientConfiguration(cc) //
        .build();

Затем для запросов используется клиент.

person wdtj    schedule 10.07.2019