Java oAuth 使用自签名客户端证书

Java oAuth using self-signed client certificate

我有一个使用自签名客户端证书的完美工作的 oauth,直到它突然停止工作。我得到 SocketException: Connection Reset。根据 Xero 的说法,我正在与之集成的 API 现在他们这边一切正常,但他们一周前确实遇到了 SSL 问题。

自上次运行以来,我们移到了 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 成功了。