Как защитить веб-службу REST в Java EE 6
Я создал веб-приложение с использованием Java EE 6 (с использованием эталонных реализаций), и я хочу показать его как веб-службу REST.
Фон состоит в том, что я хочу получать данные из веб-приложения в приложение iOS, которое я сделал. Вопрос в том, как я могу защитить приложение? Я хочу, чтобы мое приложение использовало веб-службу. Это возможно и как я могу это сделать? Мне нужно только знать, что я должен искать и читать, а не код.
Ответы
Ответ 1
К сожалению, ваш веб-сервис никогда не будет полностью безопасным, но здесь вы найдете несколько основных вещей, которые вы можете сделать:
- Использовать SSL
- Оберните все ваши (входящие) исходящие сообщения в запросы
POST
. Это предотвратит случайное отслеживание, чтобы узнать, как работает ваш веб-сервис (для того, чтобы перепроектировать протокол).
- Как-то проверять пользователей приложений. В идеале это будет включать OAUTH, например, с помощью учетных данных Google, но вы получите эту идею.
Теперь я хочу указать, почему это не будет полностью безопасно:
- Если кто-то завладеет вашим приложением и реверсирует его, все, что вы только что сделали, вышло из окна. Единственное, что будет выполнено, это проверка вашего пользователя.
- Вложение сертификата клиента (как указывали другие люди) не помогает вам в этом сценарии. Если я просто отменил обращение к вашему приложению, у меня также есть ваш клиентский сертификат.
Что вы можете сделать?
- Проверяйте учетные записи на своем сервере и контролируйте их для аномального использования.
Конечно, все это выходит из окна, когда кто-то приходит, обращает инженеров ваше приложение, строит еще один, чтобы имитировать его, и вы бы (вообще) не знали лучше. Это все, что нужно помнить.
Изменить: Кроме того, если это еще не очевидно, используйте запросы POST
(или GET
) для всех запросов приложений (на ваш сервер). Это, в сочетании с SSL, должно помешать вашим случайным snoopers.
Edit2: Кажется, что я ошибаюсь re: POST
более безопасен, чем GET
. Этот ответ был весьма полезен, указывая на это. Поэтому я предполагаю, что вы можете использовать GET
или POST
здесь взаимозаменяемо.
Ответ 2
Зависит от того, насколько безопасно это сделать.
- Если вам все равно, просто вставьте секретное слово в свое приложение и включите его во все запросы.
- Если вам немного больше нужно сделать выше, и только выставлять сервис через https.
- Если вы хотите, чтобы это было безопасно, выдайте сертификат клиента вашему приложению и требуйте
действительный сертификат клиента, который будет присутствовать при обращении к службе.
Ответ 3
мои предложения:
- используйте https вместо http. есть бесплатный сертификат ssl,
получить один и установить.
- используйте сложный путь, например 4324234AA_fdfsaf/в качестве конечной точки корня.
из-за характера протокола http, часть пути зашифрована в запросе https. поэтому он очень безопасен. есть способы расшифровать запрос с помощью атаки "человек-в-середине", но для этого требуется полный контроль над клиентским устройством, включая установку sile-сертификата ilegal. но я потратил больше времени на свое приложение, чтобы сделать его успешным.
Ответ 4
Создайте правило на компьютере, на котором размещена ваша веб-служба, чтобы разрешить вашему приложению доступ к нему через какой-либо порт. В Amazon EC2 это делается с созданием правила в группе безопасности экземпляра.
Ответ 5
Мы использовали RestEasy в качестве части для обеспечения безопасности наших веб-сервисов RESTful. Там должно быть много примеров, но вот тот, который может помочь вам начать.
http://howtodoinjava.com/2013/06/26/jax-rs-resteasy-basic-authentication-and-authorization-tutorial/
Вы также можете использовать OAUTH:
http://oltu.apache.org/index.html