【发布时间】:2015-04-07 18:17:01
【问题描述】:
我有一个使用自签名客户端证书的完美工作 oauth,直到它突然停止工作。我得到SocketException: Connection Reset。根据我正在集成的 API Xero 的说法,他们现在一切正常,但一周前他们确实遇到了 SSL 问题。
自从上次运行以来,我们迁移到了 Java 8,我为这次测试回滚了它。 最初我让它与this oauth project 一起工作,因为它是唯一支持自签名客户端证书的。 今天我稍微破解了Scribe,以便将证书添加到请求中。当我终于让它工作时,我又遇到了同样的异常。
我拥有的证书位于 KeyStore (.p12) 中,我将其导出到我的 java cacerts 中。不过,这一步应该是不需要的,因为没有它就可以工作。
所以,这就是我创建注入 HttpClient(在 oauth 项目中)和 HttpsUrlConnection(在 Scribe 中)中的 SSLContext 的方式。
Set<KeyManager> keymanagers = new HashSet<KeyManager>();
final KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(
KeyManagerFactory.getDefaultAlgorithm());
kmfactory.init(entrustStore, password.toCharArray());
final KeyManager[] kms = kmfactory.getKeyManagers();
if (kms != null) {
for (final KeyManager km : kms) {
keymanagers.add(km);
}
}
// TrustManagerFactory tmf =
// TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
// tmf.init(keyStore);
SSLContext sslContext = SSLContext.getInstance(SSLSocketFactory.TLS);
sslContext.init(
keymanagers.toArray(new KeyManager[keymanagers.size()]),
null, // tmf.getTrustManagers()
null);
// in the oauth project
SSLSocketFactory socketFactory = new SSLSocketFactory(sslContext);
Scheme scheme = new Scheme("https", 443, socketFactory);
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(scheme);
BasicClientConnectionManager cm =
new BasicClientConnectionManager(schemeRegistry);
httpClient = new DefaultHttpClient(cm);
// ---------------------------------
// in Scribe
HttpsURLConnection connection =
(HttpsURLConnection) new URL(completeUrl).openConnection();
connection.setSSLSocketFactory(sslContext.getSocketFactory());
我怀疑这是可能导致异常的代码,因为这是两个实现之间唯一的共同部分。
【问题讨论】:
-
这个问题毕竟与 TLS 版本有关。使用 TLSv1.1 就可以了。
-
你应该把它放到一个答案中并作为答案检查它
-
谢谢。我认为将其设置为正确答案太具体了,因为问题与我的代码无关。无论如何我都会这样做:D
标签: java ssl oauth scribe self-signed