15.4. EJB3 RMI através da Configuração HTTPS

Procedimento 15.5. Configure o EJB3 RMI através da Visão Geral HTTPS

Este procedimento configura o encapsulamento do tráfego de Invocação do Método Remoto sobre o HTTP criptografado do SSL. Isto possui efeito duplo da criptografia do tráfego, além de permitir a transversão dos firewalls que bloqueiam a porta RMI.
  1. Gera as chaves de criptografia e certificados.
  2. Configura o RMI através do conector da web HTTPS.
  3. Configura Servlets.
  4. Configura o conector remoto de segurança para o RMI através do HTTPS.
  5. Configura os EJB3 beans para o transporte HTTPS.
  6. Configura clientes para o RMI através do HTTPS.
Maiores informações sobre os certificados e chaves de criptografia podem ser encontradas na Seção 15.2, “Geração de chaves de criptografia e certificado”.

Procedimento 15.6. Configuração do RMI através do conector da web HTTPS.

Este procedimento cria um conector da web que escuta na porta 8443 e aceita conexões SSL dos clientes.
  • Edite o jboss-as/server/$PROFILE/deploy/jbossweb.sar/server.xml do arquivo e descomente o conector HTTPS.
    <!-- SSL/TLS Connector configuration using the admin devl guide keystore -->
    <Connector protocol="HTTP/1.1" SSLEnabled="true"
       port="8443" address="${jboss.bind.address}"
       scheme="https" secure="true" clientAuth="false"
       keystoreFile="${jboss.server.home.dir}/conf/localhost.keystore"
       keystorePass="KEYSTORE_PASSWORD" sslProtocol = "TLS" />
Resultado:

Você criou um conector da web para aceitar as conexões SSL.

Procedimento 15.7. Configuração de Servlets

Este procedimento configura um servlet que passa solicitações a partir de um conector da web para o ServletServerInvoker.
  1. Crie um diretório nomeado servlet-invoker.war no jboss-as/server/$PROFILE/deploy/.
  2. Cire um diretório WEB-INF no diretório servlet-invoker.war.
  3. Crie um arquivo nomeado web.xml naquele diretório WEB-INF com o seguinte conteúdo:
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC
    "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">
    
    
    <web-app>
    <servlet>
    <servlet-name>ServerInvokerServlet</servlet-name>
    <description>The ServerInvokerServlet receives requests via HTTP
    protocol from within a web container and passes it onto the
    ServletServerInvoker for processing.
    </description>
    <servlet-class>org.jboss.remoting.transport.servlet.web.ServerInvokerServlet</servlet-class>
    
    <init-param>
    <param-name>locatorUrl</param-name>
    <param-value>servlet://${jboss.bind.address}:8080/servlet-invoker/ServerInvokerServlet</param-value>
    <description>The servlet server invoker</description>
    </init-param>
    
    <load-on-startup>1</load-on-startup>
    </servlet>
    
    
    <servlet>
    <servlet-name>SSLServerInvokerServlet</servlet-name>
    <description>The ServerInvokerServlet receives requests via HTTPS
    protocol from within a web container and passes it onto the
    ServletServerInvoker for processing.
    </description>
    <servlet-class>org.jboss.remoting.transport.servlet.web.ServerInvokerServlet</servlet-class>
    
    <init-param>
    <param-name>locatorUrl</param-name>
    <param-value>sslservlet://${jboss.bind.address}:8443/servlet-invoker/SSLServerInvokerServlet</param-value>
    <description>The servlet server invoker</description>
    </init-param>
    
    <load-on-startup>2</load-on-startup>
    </servlet>
    
    <servlet-mapping>
    <servlet-name>ServerInvokerServlet</servlet-name>
    <url-pattern>/ServerInvokerServlet/*</url-pattern>
    </servlet-mapping>
    
    <servlet-mapping>
    <servlet-name>SSLServerInvokerServlet</servlet-name>
    <url-pattern>/SSLServerInvokerServlet/*</url-pattern>
    </servlet-mapping>
    
    </web-app>
    Resultado:

    Você criou um servlet para envio de solicitações SSL do recipiente da web a um chamador do servidor.

O locatorUrl é usado para conectar o servlet ao conector remoto através do atributo InvokerLocator do conector remoto definido no Procedimento 15.8, “Configuração do conector remoto de segurança para RMI através do HTTPS” .

Procedimento 15.8. Configuração do conector remoto de segurança para RMI através do HTTPS

Este procedimento cria um Chamador do Servidor que implementa o RMI.
  • Crie um arquivo nomeado servlet-invoker-service.xml no jboss-as/server/$PROFILE/deploy/, com o seguinte conteúdo:
    <?xml version="1.0" encoding="UTF-8"?>
    
    <server>
       <mbean code="org.jboss.remoting.transport.Connector" name="jboss.remoting:service=connector,transport=servlet"
        display-name="Servlet transport Connector">
          <attribute name="InvokerLocator">servlet://${jboss.bind.address}:8080/servlet-invoker/ServerInvokerServlet</attribute>
          <attribute name="Configuration">
             <handlers>
                <handler subsystem="AOP">org.jboss.aspects.remoting.AOPRemotingInvocationHandler</handler>
             </handlers>
          </attribute>
       </mbean>
    
       <mbean code="org.jboss.remoting.transport.Connector" name="jboss.remoting:service=connector,transport=sslservlet"
        display-name="Servlet transport Connector">
          <attribute name="InvokerLocator">sslservlet://${jboss.bind.address}:8443/servlet-invoker/SSLServerInvokerServlet</attribute>
          <attribute name="Configuration">
             <handlers>
                <handler subsystem="AOP">org.jboss.aspects.remoting.AOPRemotingInvocationHandler</handler>
             </handlers>
          </attribute>
       </mbean>
    </server>
Resultado:

Você criou um conector remoto que pode receber solicitações a partir do servlet e chamar métodos de um EJB3.

Procedimento 15.9. Configuração dos EJB3 beans para transporte HTTPS

Este procedimento configura o EJB3 para aplicar o bind ao transporte HTTPS
  • Anote o bean para o RMI através do HTTPS:

    Exemplo 15.5. Anotação de um EJB3 através do HTTPS

    // RMI tunneled over HTTPS
    @Stateless
    @RemoteBinding(clientBindUrl = "https://0.0.0.0:8443/servlet-invoker/SSLServerInvokerServlet")
    @Remote(Calculator.class)
    @SecurityDomain("other")
    public class CalculatorHttpsBean implements Calculator
    {
    ....
    Resultado:

    O EJB3 está disponível para invocação remota através do HTTPS.

Anotação de um bean para RMI através do HTTP

Você pode anotar opcionalmente o bean de invocação através do RMI através do HTTP. Este procedimento pode ser útil para testes, uma vez que isto permite que você passe chamadas RMI através de firewalls que bloqueiam portas RMI, mas que removem a camada extra da configuração de segurança.

Exemplo 15.6. Anotação de um bean para RMI através do HTTP

// RMI tunneled over HTTP
@Stateless
@RemoteBinding(clientBindUrl = "http://0.0.0.0:8080/servlet-invoker/ServerInvokerServlet")
@Remote(Calculator.class)
@SecurityDomain("other")
public class CalculatorHttpBean extends CalculatorImpl
{
....
Configure clientes para o RMI através do HTTPS

O cliente EJB deve usar as seguintes propriedades para a busca JNDI quando pesquisando por beans:

O acesso do cliente ao RMI através do HTTP(S)

HTTPS
Properties props = new Properties();
props.put("java.naming.factory.initial", "org.jboss.naming.HttpNamingContextFactory");
props.put("java.naming.provider.url", "https://localhost:8443/invoker/JNDIFactory");
props.put("java.naming.factory.url.pkgs", "org.jboss.naming");
Context ctx = new InitialContext(props);
props.put(Context.SECURITY_PRINCIPAL, username);
props.put(Context.SECURITY_CREDENTIALS, password);
Calculator calculator = (Calculator) ctx.lookup(jndiName);
// use the bean to do any operations
HTTP
Properties props = new Properties();
props.put("java.naming.factory.initial", "org.jboss.naming.HttpNamingContextFactory");
props.put("java.naming.provider.url", "http://localhost:8080/invoker/JNDIFactory");
props.put("java.naming.factory.url.pkgs", "org.jboss.naming");
Context ctx = new InitialContext(props);
props.put(Context.SECURITY_PRINCIPAL, username);
props.put(Context.SECURITY_CREDENTIALS, password);
Calculator calculator = (Calculator) ctx.lookup(jndiName);
// use the bean to do any operations
Os valores user name e password correspondem a um nome do usuário e senha para o domínio de segurança que é usado para protegero chamador do http, no O acesso do cliente ao RMI através do HTTP(S). O domínio de segurança está configurado no jboss-as/$PROFILE/deploy/http-invoker.sar/invoker.war/WEB-INF/jboss-web.xml .