1

皆さん、こんにちは。この投稿を読んでくれている皆さんに感謝します。

クライアントとサーバーの JNDI ルックアップの通信を http から https に変更しようとして、数日間苦労しました。

JBoss 4.2.0 を使用していますが、現在、アップグレードはオプションではありません。

クライアントで行ったことは、jboss マニュアルでアドバイスされているように URL を変更することです。

    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;

以前の URL は次のとおりです。

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」をどうすればよいかわかりません。クライアントの JNDI プロパティで最初に提供する、サーバーの実際の IP が必要です。

私ができた唯一のことは、クライアント Windows システムのホスト ファイルのホスト ファイルを編集し、実際の IP を含むエントリ myhosts を追加することでしたが、これはもちろん

ユーザーにそのような変更を依頼することはできないため、実稼働環境のソリューションではありません。

したがって、クライアントで次の例外が発生します。

javax.naming.CommunicationException: 操作に失敗しました [ルート例外は java.rmi.ServerException: IOE; ネストされた例外は次のとおりです。

java.net.UnknownHostException: myhost

私のサーバーの deploy/http-invoker.sar/META-INF/jboss-service.xml は以下のとおりです。useHostName を false に設定しようとすると、localhost IP が使用されます。

myhost の代わりに 127.0.0.1。

私は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>
4

1 に答える 1

0

プロパティ java.rmi.server.hostname、tomcat.proxyName、および tomcat.sslProxyName の値を確認しましたか? (JMXConsole で SystemProperties MBean を使用して値を確認できます)。

HTTP Inovker Servlet のサーバー名がどこから取得されたのかはわかりませんが、それらのプロパティの 1 つを使用している可能性があります。使用したい IP としてそれらを定義してみてください。ただし、他のサービス/アプリケーションの動作を変更する可能性があるため注意してください。

于 2013-01-09T12:12:06.020 に答える