【问题标题】:HttpClient with HTTPS certificate带有 HTTPS 证书的 HttpClient
【发布时间】:2013-10-03 22:47:43
【问题描述】:

我有点羡慕我们的 Ruby on Rails 团队,他们需要使用相同的 Web 服务,需要使用证书对 HTTPS 请求进行签名。他们拿了一颗宝石,用一行代码签署了请求,菜就做好了……

然而,Java 要求我们将证书导入我们的密钥库(试图避免这种情况),或者在内存中创建一个……这很好。但是,一旦我这样做了,似乎真正签署请求的唯一选择就是使用 HttpUrlConnection 类。 HttpUrlConnection example

我希望能够使用我现有的代码签署请求,该代码使用 apache 的 DefaultHttpClient client = new DefaultHttpClient(); - 但我看不到让 Http 客户端使用内存中的密钥库签署请求的方法。

有人遇到过这种情况吗?

【问题讨论】:

  • “需要使用证书签署 HTTPS 请求的 Web 服务”是指信任服务器证书颁发者吗?
  • @gerrytan 不,这是服务器信任请求的机制,而不是相反。如果请求未正确签名,服务器将拒绝该请求。

标签: java csr


【解决方案1】:

看看AuthSSLProtocolSocketFactory.java。您应该能够像这样执行 SSL 客户端身份验证(未经测试的代码);

Protocol.registerProtocol("https", 
new Protocol("https", new AuthSSLProtocolSocketFactory(keystoreUrl, keystorePassword, truststoreUrl, truststorePassword), 443));
HttpClient httpclient = new HttpClient();
GetMethod httpget = new GetMethod("https://www.whatever.com/");
try {
  httpclient.executeMethod(httpget);
  System.out.println(httpget.getStatusLine());
} finally {
  httpget.releaseConnection();
}

您的客户端证书进入keystoreUrl 指向的密钥库。在HttpClient SSL Guide 上阅读更多相关信息。

【讨论】:

  • 嗯,这使用了 org.apache.commons.httpclient* - 我认为这个 apache 命名空间更“最新” -> org.apache.http.*?
猜你喜欢
  • 2013-10-28
  • 1970-01-01
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 1970-01-01
  • 2014-05-05
相关资源
最近更新 更多