【问题标题】:Java oAuth using self-signed client certificate使用自签名客户端证书的 Java oAuth
【发布时间】:2015-04-07 18:17:01
【问题描述】:

我有一个使用自签名客户端证书的完美工作 oauth,直到它突然停止工作。我得到SocketException: Connection Reset。根据我正在集成的 API Xero 的说法,他们现在一切正常,但一周前他们确实遇到了 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 就可以了。
  • 你应该把它放到一个答案中并作为答案检查它
  • 谢谢。我认为将其设置为正确答案太具体了,因为问题与我的代码无关。无论如何我都会这样做:D

标签: java ssl oauth scribe self-signed


【解决方案1】:

这个问题毕竟与 TLS 版本有关。使用 TLSv1.1 就可以了。

【讨论】:

  • 我有一个顾虑,因为我在使用 TLSv1.1 时遇到了同样的问题,你的意思是说更改 Java Config 属性
  • 我集成的 api 放弃了对 TLSv1.2 的支持,所以我不得不强制我的客户端使用 v1.1。你可以在这里找到我的解决方案:stackoverflow.com/questions/28391798/…
  • 您能否发布您对 scribe 所做的更改?我正在修改 Response.java 但仍然有同样的问题。 Xero 仍然告诉我我需要证书。
  • 我没有使用 Scribe。不幸的是,当我实现它时,Scribe 不支持自签名证书。我确实做到了,但在一段时间后让它与 Scribe 一起工作,但从未真正将其投入生产。我记得我必须做的是在 Scribe 中覆盖请求对象中的几个方法,并将证书注入 http 客户端。然而,由于这些方法是包保护的,我的覆盖类必须在同一个包中,这使得整个事情只是一个我不喜欢的大黑客。但一段时间过去了,也许 Scribe 修复了它。
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 2011-05-24
  • 2018-09-21
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
相关资源
最近更新 更多