2015-02-07 138 views
0

我使用自簽名客戶端證書完成了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()); 

我懷疑這是可能導致異常的代碼,因爲這是兩個實現之間唯一的通用部分。

+0

這個問題畢竟與TLS版本有關。使用TLSv1.1做了訣竅。 – Oliveira 2015-02-08 11:56:50

+0

你應該把它寫入答案,並將其作爲答案檢查 – 2015-04-19 13:18:45

+1

謝謝。我認爲將其設置爲正確答案太具體,因爲問題與我的代碼無關。 無論如何我會這麼做的:D – Oliveira 2015-05-06 16:02:50

回答

1

這個問題畢竟與TLS版本有關。使用TLSv1.1做了訣竅。

+0

我有一個問題,因爲我面臨同樣的問題,使用TLSv1.1,你的意思是說改變Java配置屬性 – 2015-07-17 06:11:13

+0

我正在集成的api將支持放到了TLSv1上。 2,所以我不得不強迫我的客戶使用v1.1。 你可以在這裏找到我的解決方案:http://stackoverflow.com/questions/28391798/how-to-set-tls-version-on-apache-httpclient/31294623#31294623 – Oliveira 2015-07-19 18:37:02

+0

你可以請你發表你所做的修改與抄寫員?我正在修改Response.java,但仍然存在相同的問題。 Xero仍然告訴我,我需要證書。 – Sebb77 2015-09-24 15:05:13

相關問題