2015-02-07 1 views
0

У меня была отлично работающая oauth с самоподписанным клиентским сертификатом, пока она не перестала работать. Я получаю SocketException: Connection Reset. Согласно Xero, API, с которым я интегрируюсь, теперь все в порядке на их стороне, но неделю назад у них была проблема с SSL.Java oAuth с использованием самоподписанного клиентского сертификата

С тех пор, как он работал в последний раз, мы перешли на Java 8, для которого я откатился для этого теста. Первоначально я работал с this oauth project, потому что это был единственный, который, вроде бы, поддерживал бы самоподписанные клиентские сертификаты. Сегодня я немного взломал Scribe, чтобы добавить сертификат в запрос. Когда я наконец его заработал, я снова получил то же исключение.

Сертификат, который у меня есть, находится в KeyStore (.p12), который я экспортировал в свои java-cacerts. Этот шаг не должен быть необходим, поскольку он работал без него.

Таким образом, я создаю SSLContext, который вводится в HttpClient (в проекте oauth) и в HttpsUrlConnection (в Scribe).

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

+0

Вы должны поместить это в ответ и проверить его как ответ –

+1

Спасибо. Я думаю, что это слишком специфично, чтобы установить его как правильный ответ, поскольку проблема не была связана с моим кодом. Я сделаю это в любом случае: D – Oliveira

ответ

1

Вопрос был связан с версией TLS в конце концов. Использование TLSv1.1 сделало трюк.

+0

У меня есть проблема, так как я столкнулся с той же проблемой, используя TLSv1.1, вы хотите сказать, что изменяете свойства Java Config. –

+0

Api, с которым я интегрировался, отказался от поддержки TLSv1. 2, поэтому мне пришлось заставить моего клиента использовать v1.1. Вы можете найти мое решение здесь: http://stackoverflow.com/questions/28391798/how-to-set-tls-version-on-apache-httpclient/31294623#31294623 – Oliveira

+0

Не могли бы вы опубликовать изменения, которые вы сделали с писцом ? Я изменяю Response.java, но все еще имею ту же проблему. Xero все еще говорит мне, что мне нужен сертификат. – Sebb77