我正在使用 Apache 的 DefaultHttpClient 发出请求,我需要覆盖 SSL 调用,以便可以将自定义 SSLSocketFactory(本质上是客户端证书)附加到它。为此,我创建了一个新的自定义方案和连接管理器,并在创建 httpClient 时将它们传递过来:
...
new Scheme("https", 443, thirdPartySocketFactory);
...
DefaultHttpClient httpClient = new DefaultHttpClient(ccm);
...
在thirdPartySocketFactory
Scheme 创建时传递的是这里的重要部分。顾名思义,它来自一个第三方库,该库自动处理与 JBoss 服务器的相互证书身份验证。即,它将客户端证书+密码附加到每个出站请求。
调用本身也是由 JBoss 服务器发出的(我实际上是在其上托管 SOLR,这就是首先需要 Apache 调用的原因)。
问题是,thirdPartySocketFactory
对象的类型javax.net.SocketFactory
不是org.apache.http.conn.scheme.SocketFactory
Apache Scheme 所要求的(参见此处)。
问题:有没有办法通过某种包装器很好地解决这个问题?我认为 Apache SocketFactory 会以某种方式从 javax.net 继承,但它看起来不像。
或者,我可以创建一个真正自定义的 Apache SSLSocketFactory(参见此处),并带有信任库等,但我真的不想在其他选项用尽之前走下去。主要原因是,该thirdPartySocketFactory
方法经过试验和测试。
谢谢!