У меня была отлично работающая 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());
Я подозреваю, что это код, который может вызывать исключение, поскольку это единственная общая часть между двумя реализациями.
Вопрос был связан с версией TLS в конце концов. Использование TLSv1.1 сделало трюк. – Oliveira
Вы должны поместить это в ответ и проверить его как ответ –
Спасибо. Я думаю, что это слишком специфично, чтобы установить его как правильный ответ, поскольку проблема не была связана с моим кодом. Я сделаю это в любом случае: D – Oliveira