HttpClient с поддержкой нескольких протоколов TLS
Мы пишем приложение, которое должно взаимодействовать с несколькими серверами, используя HTTPS. Он должен взаимодействовать с AWS (используя библиотеки AWS), а также с некоторыми из наших внутренних служб, использующих TLS 1.2.
Я начал с изменения моего HttpClient для использования 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;
}
и добавление этого SchemeRegistry в объект DefaultHttpClient (через пружину), но при этом я получаю ошибки от AWS, и поэтому я предполагаю (я могу ошибаться), что AWS не поддерживает TLS 1.2 (я не получаю это сообщение, если я просто используйте обычный 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.
Если я пытаюсь создать два HttpClient, определенных весной, один из которых использует TLS 1.2, а другой - по умолчанию, я получаю следующую ошибку, которая, как я предполагаю, означает, что Spring не любит создавать экземпляры и автоматически подключать два объекта HttpClient:
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)
Я не очень часто использовал HTTPS в Java, так что вы могли бы дать мне несколько добрых советов, пожалуйста? 1) Как заставить Spring разрешить два объекта HttpClient и один для подключения к компонентным компонентам AWS, а другой - к другим компонентам для доступа к службам TLS1.2 2) Или можно изменить один HttpClient объект, чтобы иметь возможность попробовать TLS1.2 (через SSLContext, или SchemeRegistry или что-то), и если это не удается, то попробуйте TLS1.1 или 1.0? 3) Если оба варианта возможны, каков будет «лучший» способ сделать это?