簡體   English   中英

使用自簽名客戶端證書的Java oAuth

[英]Java oAuth using self-signed client certificate

我有一個自簽名客戶端證書的可正常運行的oauth,直到突然停止工作。 我得到SocketException: Connection Reset 據我正在與之集成的API Xero稱,現在他們一切都很好,但是一周前他們確實遇到了SSL問題。

自從上次運行以來,我們移至Java 8,在該測試中我回滾了Java 8。 最初,我讓它與此oauth項目一起工作,因為它是唯一一種支持自簽名客戶端證書的項目。 今天,為了將證書添加到請求中,我對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可以達到目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM