Java oAuth с использованием самоподписанного сертификата клиента

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

Поскольку в прошлый раз это сработало, мы перешли на Java 8, которую я откатил для этого теста. Сначала он работал с этим проектом oauth, потому что это был единственный из, поддержка самозаверяющих клиентских сертификатов. Сегодня я немного взломал 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());

Я подозреваю, что это код, который может вызывать исключение, поскольку это единственная общая часть между обеими реализациями.


person Oliveira    schedule 07.02.2015    source источник
comment
В конце концов, проблема была связана с версией TLS. Использование TLSv1.1 помогло.   -  person Oliveira    schedule 08.02.2015
comment
Вы должны поместить это в ответ и проверить это как ответ   -  person Khaled Annajar    schedule 19.04.2015
comment
Спасибо. Я думаю, что это слишком специфично, чтобы установить его как правильный ответ, поскольку проблема не была связана с моим кодом. Я все равно это сделаю :D   -  person Oliveira    schedule 06.05.2015


Ответы (1)


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

person Oliveira    schedule 06.05.2015
comment
У меня есть опасения, поскольку я столкнулся с той же проблемой, используя TLSv1.1, вы хотите сказать, что изменили свойства Java Config - person Santosh Giri; 17.07.2015
comment
API, с которым я интегрировался, отказался от поддержки TLSv1.2, поэтому мне пришлось заставить моего клиента использовать v1.1. Вы можете найти мое решение здесь: tls-версия на apache httpclient"> stackoverflow.com/questions/28391798/ - person Oliveira; 19.07.2015
comment
Не могли бы вы опубликовать изменения, которые вы сделали с писцом? Я изменяю Response.java, но все еще имею ту же проблему. Xero все еще говорит мне, что мне нужен сертификат. - person Sebb77; 24.09.2015
comment
Я не использую Scribe. К сожалению, к тому времени, когда я его реализовал, Scribe не поддерживал самозаверяющие сертификаты. Я сделал это, однако некоторое время спустя я заставил его работать со Scribe, но так и не выпустил его в производство. Я помню, что мне нужно было переопределить пару методов в объекте запроса в Scribe и внедрить сертификат в http-клиент. Однако, поскольку методы были защищены пакетом, мой класс переопределения должен был находиться в том же пакете, что делало все это просто большим взломом, который мне не нравился. Но прошло какое-то время, и, возможно, Scribe это починил. - person Oliveira; 26.09.2015