【发布时间】:2013-08-14 16:44:50
【问题描述】:
我们正在编写一个应用程序,该应用程序必须使用 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 东西 bean,另一个连接到其他 bean 以访问 TLS1.2 服务 2) 或者是否可以更改一个 HttpClient 对象以尝试 TLS1.2(通过 SSLContext 或 SchemeRegistry 或其他方式),如果失败则尝试 TLS1.1 或 1.0? 3)如果两者都可能,那么“更好”的方法是什么?
【问题讨论】:
-
在使用
SSLContext.getInstance("TLSv1.1")或SSLContext.getInstance("TLS")时是否会出现同样的错误? -
是的,我在那里遇到了同样的错误。我想知道是不是我的客户端证书搞砸了,而不是 TLS 版本。
-
尝试使用默认的
SSLContext以防万一(SSLContext sslContext = SSLContext.getDefault(),已经初始化)。否则,请尝试减少自定义:sslContext.init(createKeyManager(), null, null)应使用 TM 和 SecureRandom 的默认值。密钥管理器没有默认值,因此您的密钥管理器代码中可能仍然存在问题(仅在服务器请求客户端证书时有用)。 -
我创建了一篇关于如何为 android 4.1+ 启用它的小博文blog.dev-area.net/2015/08/13/…
标签: java spring ssl httpclient apache-commons-httpclient