2015-02-07 85 views
0

我使用自签名客户端证书完成了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()); 

我怀疑这是可能导致异常的代码,因为这是两个实现之间唯一的通用部分。

+0

这个问题毕竟与TLS版本有关。使用TLSv1.1做了诀窍。 – Oliveira 2015-02-08 11:56:50

+0

你应该把它写入答案,并将其作为答案检查 – 2015-04-19 13:18:45

+1

谢谢。我认为将其设置为正确答案太具体,因为问题与我的代码无关。 无论如何我会这么做的:D – Oliveira 2015-05-06 16:02:50

回答

1

这个问题毕竟与TLS版本有关。使用TLSv1.1做了诀窍。

+0

我有一个问题,因为我面临同样的问题,使用TLSv1.1,你的意思是说改变Java配置属性 – 2015-07-17 06:11:13

+0

我正在集成的api将支持放到了TLSv1上。 2,所以我不得不强迫我的客户使用v1.1。 你可以在这里找到我的解决方案:http://stackoverflow.com/questions/28391798/how-to-set-tls-version-on-apache-httpclient/31294623#31294623 – Oliveira 2015-07-19 18:37:02

+0

你可以请你发表你所做的修改与抄写员?我正在修改Response.java,但仍然存在相同的问题。 Xero仍然告诉我,我需要证书。 – Sebb77 2015-09-24 15:05:13

相关问题