Java RMI - Acceso a objetos de registro RMI en una máquina diferente - AccessControlException?

Estoy intentando que un cliente en una máquina se comunique con un servidor en otra máquina a través de Java RMI. Implemento el servidor en el host IP X en el puerto Y. Luego intento que el cliente busque el objeto remoto en el servidor y obtengo la siguiente excepción:

Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission <IP address>:<port> connect,resolve)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
    at java.net.Socket.connect(Socket.java:524)
    at java.net.Socket.connect(Socket.java:478)
    at java.net.Socket.<init>(Socket.java:375)
    at java.net.Socket.<init>(Socket.java:189)
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at nursestation.NurseStation.subscribeToPatients(NurseStation.java:65)
    at nursestation.NurseStation.<init>(NurseStation.java:42)
    at nursestation.perf.SimplePerfTest.main(SimplePerfTest.java:28)

Tenga en cuenta que tanto el cliente como el servidor se ejecutan con un archivo de política que permite todos los permisos. El registro RMI también se está ejecutando en el servidor. ¿Alguna idea de por qué recibo esta excepción? ¿Qué puedo hacer para permitir que el cliente hable con un servidor que se ejecuta en un servidor diferente?

Actualizar:

Archivo de política

grant {
  permission java.security.AllPermission;
};

Inicio del cliente: uso del complemento RMI para Eclipse

  1. Inicie el registro RMI
  2. Ejecuté "java BedsideMonitorMain patient1 vital1 vital2" con el archivo de política especificado para java.security.policy que se muestra arriba y java.rmi.server.codebase apuntando al código del espacio de trabajo de mi proyecto
  3. El objeto paciente1 está vinculado al registro RMI

Inicio del servidor

  1. Ejecuté "java NurseStationMain patient1" con el archivo de política especificado para java.security.policy que se muestra arriba y java.rmi.server.codebase apuntando al código del espacio de trabajo de mi proyecto

preguntado el 08 de noviembre de 11 a las 15:11

¿Está seguro de que está utilizando los archivos de políticas correctamente? Este artículo stackoverflow.com/questions/2427473/… implica que puede obtener este seguimiento de pila cuando no tiene el archivo de política configurado correctamente. Podría valer la pena editar la pregunta para mostrar los archivos de políticas y cómo está invocando al cliente y al servidor. -

También asegúrese de que su configuración de autenticación sea correcta. Intenta agregar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false para ver si funciona. -

Ejecute su cliente con -Djava.security.debug = acceso, falla y verá exactamente qué permisos están siendo otorgados / denegados por qué dominios de protección, por lo que también verá si sus archivos .policy están vigentes, que claramente no lo son. t. -

Lo ejecutaré tan pronto como pueda. Por ahora, hemos notado que la comunicación remota funciona en una de las máquinas de mi equipo, pero no en la mía. ¿Tengo la sensación de que esto tiene que ver con los firewalls posiblemente? -

1 Respuestas

Entonces descubrí el problema subyacente. Aparentemente, ambas máquinas tenían una clave de licencia diferente para el complemento RMI de Eclipse, que no permitía que ambas máquinas se comunicaran entre sí. Cuando hice idéntica la clave de licencia en ambas máquinas, pude hacer que el cliente y el servidor se comunicaran entre sí. Para mi propósito, esto es suficiente, ya que no estoy usando este sistema en un entorno de producción (es para un proyecto de clase). Sin embargo, tengo curiosidad por saber cuál sería la "mejor" solución a este problema.

respondido 12 nov., 11:19

Personalmente, no puedo ver qué tendría que ver la clave de licencia de Eclipse con las conexiones básicas de RMI Java. ¿Puedes explicar? - djangofan

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.