我们正在编写一个必须使用 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对象中(通过spring),但是这样做我从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.
如果我尝试在 spring 中定义两个 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)
我在java中很少使用HTTPS,所以请好心人给我一些建议吗?
1)我如何让Spring允许两个HttpClient对象,一个连接到AWS stuff beans,另一个连接到其他bean以访问TLS1.2服务
2)或者是否可以更改一个 HttpClient 对象以能够尝试 TLS1.2(通过 SSLContext、SchemeRegistry 或其他方式),如果失败则尝试 TLS1.1 或 1.0?
3)如果两者都可能,那么“更好”的做法是什么?