首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java安全Java服务

Java安全Java服务
EN

Stack Overflow用户
提问于 2010-02-03 02:23:06
回答 2查看 5.8K关注 0票数 1

我正在尝试将http webservice转换为https。我将标签添加到了the服务中。

代码语言:javascript
运行
复制
@SecurityDomain(value = "jboss-ssl")

代码语言:javascript
运行
复制
@WebContext(contextRoot="/path/one",  // already here
 urlPattern="/X",   // already here
    authMethod = "CLIENT-CERT",  // added
    transportGuarantee = "CONFIDENTIAL") // added

但是当我的客户端尝试连接到https://hostname:80/path/to/ws时,我得到了一个异常:

Caused by: java.io.IOException: HTTPS hostname wrong: should be <hostname>

(所有内容如下所示)。我怀疑这与正在使用的证书有关。我想我需要使用java keytool来解决这个问题。如果有人能帮我核实一下,我将不胜感激。

代码语言:javascript
运行
复制
javax.xml.soap.SOAPException: java.io.IOException: Could not transmit message
        at org.jboss.ws.core.soap.SOAPConnectionImpl.callInternal(SOAPConnectionImpl.java:115)
        at org.jboss.ws.core.soap.SOAPConnectionImpl.call(SOAPConnectionImpl.java:66)
        at com.alcatel.tpapps.common.utils.SOAPClient.execute(SOAPClient.java:146)
        at com.alcatel.tpapps.common.utils.SOAPClient.main(SOAPClient.java:233)
Caused by: java.io.IOException: Could not transmit message
        at org.jboss.ws.core.client.RemotingConnectionImpl.invoke(RemotingConnectionImpl.java:192)
        at org.jboss.ws.core.client.SOAPRemotingConnection.invoke(SOAPRemotingConnection.java:77)
        at org.jboss.ws.core.soap.SOAPConnectionImpl.callInternal(SOAPConnectionImpl.java:106)
        ... 3 more
Caused by: org.jboss.remoting.CannotConnectException: Can not connect http client invoker. HTTPS hostname wrong:  should be <hostname>.
        at org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpURLConnection(HTTPClientInvoker.java:368)
        at org.jboss.remoting.transport.http.HTTPClientInvoker.transport(HTTPClientInvoker.java:148)
        at org.jboss.remoting.MicroRemoteClientInvoker.invoke(MicroRemoteClientInvoker.java:141)
        at org.jboss.remoting.Client.invoke(Client.java:1858)
        at org.jboss.remoting.Client.invoke(Client.java:718)
        at org.jboss.ws.core.client.RemotingConnectionImpl.invoke(RemotingConnectionImpl.java:171)
        ... 5 more
Caused by: java.io.IOException: HTTPS hostname wrong:  should be <hostname>
        at sun.net.www.protocol.https.HttpsClient.checkURLSpoofing(HttpsClient.java:490)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:415)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:170)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:857)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
        at org.jboss.remoting.transport.http.HTTPClientInvoker.useHttpURLConnection(HTTPClientInvoker.java:288)
        ... 10 more

更新1

我尝试了以下方法,但对异常没有影响:

代码语言:javascript
运行
复制
hostname[username:/path/two/path][525]% keytool -genkey -keystore server.keystore -alias hostname
...
...

更新2

实际上,我不确定我在更新1中所做的是正确的,因为我不必在那里指定主机名……

更新3

我指定hostname作为别名

代码语言:javascript
运行
复制
What is the name of your organizational unit?
  [Unknown]:  hostname

但这仍然没有解决我的问题。是否有添加主机名的特定方法?

我很确定这篇文章解决了这个问题,但是它太晦涩难懂了。回到这个问题上来。

http://forums.sun.com/thread.jspa?threadID=5315653

EN

回答 2

Stack Overflow用户

发布于 2010-02-04 00:31:05

这个解决方案也很有帮助。

Java's keytool command with IP addresses

代码语言:javascript
运行
复制
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;

HostnameVerifier hv = new HostnameVerifier() {
    public boolean verify(String urlHostName, SSLSession session) {
        System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
        return true;
    }
};

HttpsURLConnection.setDefaultHostnameVerifier(hv);
票数 3
EN

Stack Overflow用户

发布于 2010-02-03 02:53:39

这些似乎都是相似的问题:

Link 1

同样的问题。

Link 2

接受所有证书。

代码语言:javascript
运行
复制
private static final HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() {
   public boolean verify(String hostname, SSLSession session) {
      return true;
   }
};
...
HttpsUrlConnection con = (HttpsUrlConnection)new URL("https://foo.bar.com").openConnection();
con.setHostnameVerifier(DO_NOT_VERIFY);
InputStream in = con.getInputStream();

然而,我不确定该把它放在哪里。客户端还是服务器端?无论如何,如果可以的话,我宁愿只正确地设置证书。

Link 3

使用此解决方案:

代码语言:javascript
运行
复制
HostnameVerifier ver = new HostnameVerifier()
{
  public boolean verify(String urlHostname,String certHostname)
  {
    return java.net.InetAddress.getByName(urlHostname).equals(java.net.InetAddress.getByName(certHostname));
  }
};
com.sun.net.ssl.HttpsURLConnection con = ...(obtain connection);
con.setHostnameVerifier(ver);

然而,我不确定该把它放在哪里。客户端还是服务器端?无论如何,如果可以的话,我宁愿只正确地设置证书。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2186543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档