15.4. EJB3 RMI através da Configuração HTTPS
Procedimento 15.5. Configure o EJB3 RMI através da Visão Geral HTTPS
- Gera as chaves de criptografia e certificados.
- Configura o RMI através do conector da web HTTPS.
- Configura Servlets.
- Configura o conector remoto de segurança para o RMI através do HTTPS.
- Configura os EJB3 beans para o transporte HTTPS.
- Configura clientes para o RMI através do HTTPS.
Procedimento 15.6. Configuração do RMI através do conector da web HTTPS.
- 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" />
Você criou um conector da web para aceitar as conexões SSL.
Procedimento 15.7. Configuração de Servlets
ServletServerInvoker
.
- Crie um diretório nomeado
servlet-invoker.war
nojboss-as/server/$PROFILE/deploy/
. - Cire um diretório
WEB-INF
no diretórioservlet-invoker.war
. - Crie um arquivo nomeado
web.xml
naquele diretórioWEB-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.
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
- Crie um arquivo nomeado
servlet-invoker-service.xml
nojboss-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>
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
- 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.
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 { ....
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
jboss-as/$PROFILE/deploy/http-invoker.sar/invoker.war/WEB-INF/jboss-web.xml
.