我使用自簽名客戶端證書完成了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());
我懷疑這是可能導致異常的代碼,因爲這是兩個實現之間唯一的通用部分。
這個問題畢竟與TLS版本有關。使用TLSv1.1做了訣竅。 – Oliveira 2015-02-08 11:56:50
你應該把它寫入答案,並將其作爲答案檢查 – 2015-04-19 13:18:45
謝謝。我認爲將其設置爲正確答案太具體,因爲問題與我的代碼無關。 無論如何我會這麼做的:D – Oliveira 2015-05-06 16:02:50