JRMPInvoker has a method private void loadCustomSocketFactories()
If you defined a custom serverSocketFactory, an instance of this factory is made
and the BindAddress is set:
if( serverSocketFactoryName != null )
{
Class ssfClass = loader.loadClass(serverSocketFactoryName);
serverSocketFactory = (RMIServerSocketFactory) ssfClass.newInstance();
if( serverAddress != null )
{
// See if the server socket supports setBindAddress(String)
try
{
Class[] parameterTypes = {String.class};
Method m = ssfClass.getMethod("setBindAddress", parameterTypes);
Object[] args = {serverAddress};
m.invoke(serverSocketFactory, args);
}
catch (NoSuchMethodException e)
{
log.warn("Socket factory does not support setBindAddress(String)");
// Go with default address
}
catch (Exception e)
{
log.warn("Failed to setBindAddress="+serverAddress+" on socket factory", e);
// Go with default address
}
}
}
So far, so good.
But if you use org.jboss.security.ssl.RMISSLServerSocketFactory
you also have to invoke the setSecurityDomain-method.
Otherwise the RMISSLServerSocketFactory is constructed WITHOUT
a securityDomain. As a result, a DomainServerSocketFactory is constructed:
domainFactory = new DomainServerSocketFactory();
Instead of using for instance:
domainFactory = DomainServerSocketFactory.getDefault();
So the securityDomain always remains null and you get a NullPointerException
upon startup of jBoss.
In other words: it is impossible to use the provided classes to have
RMI working over SSL.
A quick patch would be to use DomainServerSocketFactory.getDefault()
in class RMISSLServerSocketFactory.
A more elegant solution would be to check for a SecurityDomain in the
JRMPInvoker class and to set this variable. This way people could chose
there own domain instead of using java:/jaas/other.
I hope I have given you enough info to solve this bug,
Bruno