ceruleaner 2009-07-13 12:51
浏览 866
已采纳

client调用多个不同的基于HTTPS的webservices时,System.setProperty(javax.net.ssl.XXX)不起作用?

在同一个web应用里,
作为client访问基于HTTPS的webservices,client这边通过设置以下系统参数,是可以成功的,
System.setProperty("javax.net.ssl.keyStore", keystoreFile);
System.setProperty("javax.net.ssl.keyStorePassword",keystorePassword);
System.setProperty("javax.net.ssl.trustStore", truststoreFile);
System.setProperty("javax.net.ssl.trustStorePassword",truststorePassword);

但是,现在clinet还要访问另外一个也是基于HTTPS的web services,当然证书是不一样的,
这时client能再次设置这些系统参数为另外的值么?访问能成功么?

找到之前的一个相关的帖子,好像没有结论?http://www.iteye.com/problems/9652

多谢! :)
[b]问题补充:[/b]
注释掉第一次的调用,第二次的调用是成功的,所以相关参数肯定是设置对了。
但是只要运行两次调用(调不同的webservice),即使中间clearProperty,还是不行。
还尝试过颠倒两次调用的顺序,结果也总是第二次的调用不成功。 :(
[b]问题补充:[/b]
to pJun,System.getProperty的结果是第二次设置的值。thx
[b]问题补充:[/b]
是不是不应该采取这种设置系统参数的方式啊?
有其他方法么? 8)
[b]问题补充:[/b]
HTTPClient能不能动态的设置keystore/keystorepasswd/truststore/truststorepasswd呢? :wink:
[b]问题补充:[/b]
换了一种方式,使用了http://hc.apache.org/httpclient-3.x/sslguide.html里提供的AuthSSLProtocolSocketFactory

调用的代码也是按照其注释写的,但是感觉只是调用了一下构造函数,并没有实质的动作,调用结果也是失败的:PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

下面是代码:
[code="java"]
HttpClient client = new HttpClient(new MultiThreadedHttpConnectionManager());
client.getHttpConnectionManager().getParams().setSoTimeout(3000);
client.getHttpConnectionManager().getParams().setMaxTotalConnections(5);
Protocol authhttps = null;
try {
authhttps = new Protocol(
"https",
new AuthSSLProtocolSocketFactory(
new URL(
"file:/C:/Documents and Settings/test/Desktop/tmp/keystore"),
"mypasswd",
new URL(
"file:/C:/Documents and Settings/test/Desktop/tmp/truststore"),
"mypasswd"), 7743);
} catch (MalformedURLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
client.getHostConfiguration().setHost(wsHost,wsPort, authhttps);
DefaultHttpMethodRetryHandler retryhandler = new DefaultHttpMethodRetryHandler(
recoverTimes, true);
client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
retryhandler);
PostMethod post = new PostMethod(wsURL);
RequestEntity entity = new StringRequestEntity(requestXML, "text/xml",
"UTF-8");
post.setRequestEntity(entity);
HttpClientResponse httpClientResponse = null;
try {
int result = client.executeMethod(post);
logger.log(Level.INFO, "result ="+ result);
String responseXML = post.getResponseBodyAsString();
} catch (Exception ex) {
logger.warning(ex.toString());
return;
} finally {
post.releaseConnection();
}[/code]

JDK1.5
[b]问题补充:[/b]
To lovewhzlq ,
//和///都试了一下,错误还是一样。 :x
[b]问题补充:[/b]
最初重复设置两次系统参数时,也是抛这种类型的异常…… :?
[b]问题补充:[/b]
To pJun, 3个斜杠试过了,也不行。

是必须调用注册么? Protocol.registerProtocol("https", authhttps);
注不注册有区别么?
我再试试不用URL表示本地文件路径吧。。。。也许就能找到文件了。
[b]问题补充:[/b]
需要调用registerProtocol,否则AuthSSLProtocolSocketFactory不起作用。谢谢大家。

  • 写回答

9条回答 默认 最新

  • wanghaolovezlq 2009-07-13 14:56
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(8条)

报告相同问题?

悬赏问题

  • ¥15 怀疑手机被监控,请问怎么解决和防止
  • ¥15 Qt下使用tcp获取数据的详细操作
  • ¥15 idea右下角设置编码是灰色的
  • ¥15 全志H618ROM新增分区
  • ¥15 在grasshopper里DrawViewportWires更改预览后,禁用电池仍然显示
  • ¥15 NAO机器人的录音程序保存问题
  • ¥15 C#读写EXCEL文件,不同编译
  • ¥15 MapReduce结果输出到HBase,一直连接不上MySQL
  • ¥15 扩散模型sd.webui使用时报错“Nonetype”
  • ¥15 stm32流水灯+呼吸灯+外部中断按键