我使用自签名客户端证书完成了oauth,直到突然停止工作。我得到SocketException: Connection Reset
。根据Xero,我正在整合的API,现在一切正常,但他们一周前确实存在SSL问题。使用自签名客户端证书的Java oAuth
自从上次工作以来,我们转移到了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做了诀窍。 – Oliveira 2015-02-08 11:56:50
你应该把它写入答案,并将其作为答案检查 – 2015-04-19 13:18:45
谢谢。我认为将其设置为正确答案太具体,因为问题与我的代码无关。 无论如何我会这么做的:D – Oliveira 2015-05-06 16:02:50