аутентификация и безопасность Java RMI. exportObject делает его публичным? - PullRequest
2 голосов
/ 09 октября 2009

Вопрос:

Когда вы UnicastRemoteObject.exportObject(instance). Станет ли этот экземпляр общедоступным для всех клиентов? Даже если для поиска порта требуется немного хитрости.

Это ситуация:

У меня есть настройка клиент / сервер Java RMI, и я хотел добавить некоторую аутентификацию. Предоставление клиенту возможности использовать комбинацию user / pass до того, как сработают другие вызовы RPC.

Я нашел в Интернете простое предложение, которое на первый взгляд выглядело как хорошая идея.

interface LoginService implements Remote {
  public MainService login(String username, char[] password) throws RemoteException;
}

interface MainService implements Remote {
  /* all my real rpc calls go here */
}

Идея состоит в том, чтобы создать удаленный объект для реализации пост-аутентифицированного доступа к RPC. И получить доступ к нему через первый уровень, который выполняет аутентификацию.

LoginServiceImpl.login() должен выглядеть примерно так.

public MainService login(String username, char[] password) throws RemoteException {
  /* verify username and password */
  MainService service = new MainServiceImpl();
  MainService stub = UnicastRemoteObject.exportObject(service, 0);
  return stub;
}

Таким образом, каждый клиент, который вызывает login(), получает свой собственный выделенный удаленный экземпляр MainService. Естественно, я бы обернул все это в ssl, чтобы защитить простой текстовый пароль.

Это проблема:

Похоже, что после того, как я экспортировал свой новый экземпляр MainServiceImpl, он стал общедоступным. Любой другой клиент, который знает, что искать, может подключиться к нему и сделать вызовы в этом MainServiceImpl экземпляре.

Мне нужно экспортировать MainService после его создания, иначе RMI не отправит заглушку клиенту. Вместо этого он попытается сериализовать экземпляр MainService.

Я мог бы вставить имя пользователя в MainService, но это на самом деле не поможет.

Ответы [ 2 ]

0 голосов
/ 10 июля 2011

SSL с аутентификацией клиента решит эту проблему.

0 голосов
/ 09 октября 2009

Перед переключением на JRMP (проводной протокол RMI) необходимо выполнить аутентификацию. Для этого была JSR, но за нее проголосовали. Джери делает это для JINI.

...