大家好,感谢读过这篇文章的人。
我一直在苦苦挣扎几天,试图将我的客户端 - 服务器JNDI查询的通信从http更改为https。
我正在使用JBoss 4.2.0,目前无法升级它。
我在客户端所做的是按照jboss手册中的建议更改网址。
System.setProperty("javax.net.ssl.trustStore", "C:/Program Files (x86)/localhost.truststore");
System.setProperty("javax.net.ssl.trustStoreType", "JKS");
System.setProperty("javax.net.ssl.trustStorePassword", "opensource");
System.setProperty(HTTPSClientInvoker.IGNORE_HTTPS_HOST,"true");
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.naming.HttpNamingContextFactory");
jndiProperties.put(Context.PROVIDER_URL, "https://"+serverIp+":8443/invoker/JNDIFactory"
final Context context = new InitialContext(jndiProperties);
T facade = (T) context.lookup(facadeName);
return facade;
之前的网址是:
jndiProperties.put(Context.PROVIDER_URL, "jnp://"+serverIp+":1099");
并且contextfactory是
jndiProperties.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
serverIp是用户输入的真实服务器。我不想使用网络主机名,因为我的服务器中没有dns服务器。
我对jnp url和jnp命名工厂没有任何问题,但是当我尝试通过SSL访问时,HTTPNamingContextFactory.getNamingServer(URL providerURL)
中的Jboss代码用主机名覆盖我的ip,客户端没有认。
它从服务器进行一些编组并获取我的linux服务器主机文件中定义的第一个主机条目。
HttpInvokerProxy最终通过从服务器写入externalURLValue来实现这一点,即:
"https://myhost:8443/invoker/JMXInvokerServlet".
我的客户端不知道如何处理这个“myhost”,它需要服务器的真实ip,我最初在客户端的JNDI属性中提供。
我唯一能做的就是在客户端Windows系统主机文件中编辑hosts文件,并使用真正的ip添加一个条目myhosts,但这当然是
不是生产环境的解决方案,因为我不能要求我的用户进行此类修改。
所以我在客户端得到了这个例外:
javax.naming.CommunicationException:操作失败[root异常是java.rmi.ServerException:IOE;嵌套异常是:
java.net.UnknownHostException: myhost
我的服务器的deploy / http-invoker.sar / META-INF / jboss-service.xml如下所示,如果我尝试将useHostName设置为false,那么将使用localhost ip
127.0.0.1而不是myhost,这没有任何帮助,因为我只需要保留我最初提供的ip。
我是JBoss的新手,所以我会理解我做错了什么,以及如何在不升级JBOSS的情况下解决这个问题。
谢谢
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE server>
<!-- $Id: jboss-service.xml 26202 2004-11-29 16:54:36Z starksm $ -->
<server>
<!-- The HTTP invoker service configration
-->
<mbean code="org.jboss.invocation.http.server.HttpInvoker"
name="jboss:service=invoker,type=https">
<!-- Use a URL of the form http://<hostname>:8080/invoker/EJBInvokerServlet
where <hostname> is InetAddress.getHostname value on which the server
is running.
-->
<attribute name="InvokerURLPrefix">https://</attribute>
<attribute name="InvokerURLSuffix">:${https.port}/invoker/EJBInvokerServlet</attribute>
<attribute name="UseHostName">true</attribute>
</mbean>
<!-- Expose the Naming service interface via HTTP -->
<mbean code="org.jboss.invocation.http.server.HttpProxyFactory"
name="jboss:service=invoker,type=http,target=Naming">
<!-- The Naming service we are proxying -->
<attribute name="InvokerName">jboss:service=Naming</attribute>
<!-- Compose the invoker URL from the cluster node address -->
<attribute name="InvokerURLPrefix">https://</attribute>
<attribute name="InvokerURLSuffix">:${https.port}/invoker/JMXInvokerServlet</attribute>
<attribute name="UseHostName">true</attribute>
<attribute name="ExportedInterface">org.jnp.interfaces.Naming</attribute>
<attribute name="JndiName"></attribute>
<attribute name="ClientInterceptors">
<interceptors>
<interceptor>org.jboss.proxy.ClientMethodInterceptor</interceptor>
<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
<interceptor>org.jboss.naming.interceptors.ExceptionInterceptor</interceptor>
<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
</interceptors>
</attribute>
</mbean>
<!-- Expose the Naming service interface via clustered HTTP. This maps
to the ReadOnlyJNDIFactory servlet URL
-->
<mbean code="org.jboss.invocation.http.server.HttpProxyFactory"
name="jboss:service=invoker,type=http,target=Naming,readonly=true">
<attribute name="InvokerName">jboss:service=Naming</attribute>
<attribute name="InvokerURLPrefix">http://</attribute>
<attribute name="InvokerURLSuffix">:8080/invoker/readonly/JMXInvokerServlet</attribute>
<attribute name="UseHostName">true</attribute>
<attribute name="ExportedInterface">org.jnp.interfaces.Naming</attribute>
<attribute name="JndiName"></attribute>
<attribute name="ClientInterceptors">
<interceptors>
<interceptor>org.jboss.proxy.ClientMethodInterceptor</interceptor>
<interceptor>org.jboss.proxy.SecurityInterceptor</interceptor>
<interceptor>org.jboss.naming.interceptors.ExceptionInterceptor</interceptor>
<interceptor>org.jboss.invocation.InvokerInterceptor</interceptor>
</interceptors>
</attribute>
</mbean>
</server>
答案 0 :(得分:0)
您是否检查过java.rmi.server.hostname,tomcat.proxyName和tomcat.sslProxyName属性的值? (您可以使用JMXConsole中的SystemProperties MBean检查它们的值。)
我不知道从哪里获取HTTP Inovker Servlet的服务器名称,但它可能使用其中一个属性。尝试将它们定义为您希望它使用的ip,但要小心,因为它可能会改变其他服务/应用程序的行为。