2013-01-08 92 views
1

大家好,感謝任何人閱讀這篇文章。JNDI over SSL UnknownHostException

我一直在掙扎幾天,試圖改變我的客戶端服務器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屬性中提供。

我能夠做的唯一的事情就是編輯hosts在客戶端的Windows系統hosts文件,文件,並用真實IP添加一個條目myhosts,但是這當然是

不是生產的解決方案環境,因爲我不能要求我的用戶進行這樣的修改。

所以我得到這個例外在客戶端:

javax.naming.CommunicationException:操作失敗[根異常是java.rmi.ServerException:IOE;嵌套的例外是:

java.net.UnknownHostException: myhost 

我的服務器的部署/ HTTP-invoker.sar/META-INF /的jboss-service.xml的是下面,如果我嘗試useHostName設置爲false,那麼將使用本地主機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

你檢查屬性java.rmi.server.hostname的值,Tomcat的。proxyName和tomcat.sslProxyName? (您可以使用JMXConsole中的SystemProperties MBean檢查它們的值)。

我不知道從哪裏獲取服務器名稱HTTP Inovker Servlet,但它可能會使用其中一個屬性。嘗試將它們定義爲您希望使用的IP,但要小心,因爲它可能會改變其他服務/應用程序的行爲。