Amazon Secrets Manager, Java 7 и CipherSuites - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь заставить 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 использует Apache HTTP Client (httpclient-4.5.7) под крышками. Есть ли статический способ подключения клиента Apache с помощью собственного Socket, SocketFactory или SSLContext? Тот, который не требует доступа к объекту HTTPClient (который также не предоставляется).

1 Ответ

0 голосов
/ 10 июля 2019

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

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();

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

...