Piszemy aplikację, która musi komunikować się z kilkoma serwerami za pomocą protokołu HTTPS. Musi komunikować się z AWS (przy użyciu bibliotek AWS), a także z niektórymi z naszych wewnętrznych usług korzystających z TLS 1.2.HttpClient obsługujący wiele protokołów TLS
Zacząłem poprzez zmianę mojego HttpClient używać TLS 1.2 SSLContext:
public static SchemeRegistry buildSchemeRegistry() throws Exception {
final SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(createKeyManager(), createTrustManager(), new SecureRandom());
final SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("https", 443, new SSLSocketFactory(sslContext)));
return schemeRegistry;
}
i wstrzykiwanie tej SchemeRegistry do obiektu DefaultHttpClient (przez sprężynę), ale robi, że pojawiają się błędy z AWS i tak sądzę (mogę się mylić), że AWS nie obsługuje TLS 1.2 (nie ten komunikat jeśli po prostu użyć zwykłej DefaultHttpClient):
AmazonServiceException: Status Code: 403, AWS Service: AmazonSimpleDB, AWS Request ID: 5d91d65f-7158-91b6-431d-56e1c76a844c, AWS Error Code: InvalidClientTokenId, AWS Error Message: The AWS Access Key Id you provided does not exist in our records.
Jeśli staram się mieć dwa HttpClients zdefiniowane wiosną, jeden który używa TLS 1.2 i taki, który jest domyślny, dostaję foll z powodu błędów, które zakładam, oznacza to, że wiosna nie lubi instancji i autowiring httpclient dwa obiekty:
SEVERE: Servlet /my-refsvc threw load() exception
java.lang.NullPointerException
at com.company.project.refsvc.base.HttpsClientFactory.<clinit>(BentoHttpsClientFactory.java:25)
...
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1031)
at
...
org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
Nie używałem dużo HTTPS w java więc można mili ludzie dać mi jakieś rady proszę? 1) W jaki sposób uzyskać Spring, aby umożliwić dwa obiekty HttpClient i jeden do połączenia z materiałami fasoli AWS, a drugi do połączenia z innymi komponentami bean w celu uzyskania dostępu do usług TLS1.2 2) Czy możliwa jest zmiana jeden obiekt HttpClient, aby móc wypróbować TLS1.2 (przez SSLContext, SchemeRegistry lub coś podobnego), a jeśli to się nie powiedzie, spróbuj TLS1.1 lub 1.0? 3) Jeśli oba są możliwe, jaki byłby "lepszy" sposób na zrobienie tego?
Czy masz ten sam błąd przy użyciu 'SSLContext.getInstance ("TLSv1.1")' lub ' SSLContext.getInstance ("TLS") '? – Bruno
Tak, pojawia się ten sam błąd. Zastanawiam się, czy jest to mój certyfikat po stronie klienta, który zepsuje to zamiast wersji TLS. – agentgonzo
Spróbuj użyć domyślnego 'SSLContext' na wszelki wypadek (' SSLContext sslContext = SSLContext.getDefault() ', już zainicjalizowane). W przeciwnym razie spróbuj mniej dostosowań: 'sslContext.init (createKeyManager(), null, null)' powinien użyć wartości domyślnej dla TM i SecureRandom. Dla keymanagera nie ma wartości domyślnej, więc może być coś nie tak w twoim kodzie keymanagera (przydatne tylko wtedy, gdy serwer żąda certyfikatu klienta). – Bruno