У меня был отлично работающий 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());
Я подозреваю, что это код, который может вызывать исключение, поскольку это единственная общая часть между обеими реализациями.