#java #ipsec
#java #ipsec
Вопрос:
Я изучаю обеспечение безопасности сетевых коммуникаций (UDP и TCP). Похоже, что «использовать IPSec» — хорошее решение. Я знаю, что это реализовано на более низком уровне, и приложению не нужно это видеть. Однако я хочу, чтобы мое Java-приложение было безопасным и знало, что оно безопасно.
Итак, что мне нужно сделать на практике, чтобы использовать IPSec в приложении Java? Использую ли я по-прежнему DatagramSocket / java.net.Socket.Сокет? Есть ли что-то, что мне нужно сделать с System.getSecurityManager()? Должен ли я выполнять настройку на уровне ОС (Windows XP, подключенная к Amazon cloud)?
В какой-то момент мне нужно будет проверить / предоставить учетные данные безопасности. Как это делается?
Я изрядно погуглил и увидел на сетевом уровне, как это работает. Но я не нашел ничего похожего на пример кода приложения, который использует преимущества IPSec.
Кто-нибудь делал это?
Спасибо!
Комментарии:
1. Мне любопытно, почему вы выбираете IPSec вместо технологии шифрования с хорошо известным API (например, openssl)
2. Я бы использовал SSL в качестве стандартного способа защиты соединения. например, каждый браузер поддерживает его. У вас не было бы сомнений на уровне Java, который использует SSL и полностью находится под управлением приложения, что, по-видимому, является вашим предпочтением.
3. @Mike, не уверен, что Java поддерживает openssl, но у нее есть встроенная поддержка SSL, так что мне нравится твое мышление.
4. Часть проекта будет (в конечном итоге) реализована на встроенном оборудовании с ограниченной мощностью, поэтому, хотя SSL является одним из вариантов, мы рассматриваем другие.
Ответ №1:
Хорошо, я нашел информацию, которую искал. Возможно, в вопросе не совсем ясно, чего я хотел, но это то, что я нашел:
IPSec необходимо настроить в операционной системе (для упрощения). Вы устанавливаете соединение между двумя машинами и предоставляете им действовать самостоятельно. Вы знаете, что у вас есть безопасное соединение, потому что вы разрешаете безопасные соединения только на этом компьютере. Если бы у вас не был настроен IPSec, это было бы небезопасно, поэтому вам просто нужно убедиться, что вы это делаете.
Безопасность может быть общим секретом или сертификатом X509
И некоторые полезные инструкции:
Для Linux http://www.ipsec-howto.org/x304.html
Для Windows:http://www.elandsys.com/resources/ipsec/wincert.html
Ответ №2:
Вы не можете этого сделать — как вы сказали, это на более низком уровне — намного ниже!
Есть ли какая-то конкретная причина, по которой «использовать SSL» не является хорошим решением?
Комментарии:
1. Таким образом, приложение не может знать, защищено ли оно IPSec или нет?
2. во всяком случае, не переносимо. Если вы используете IPSec на основе хоста, то это может быть возможно определить с помощью собственных методов, но они будут зависеть от операционной системы. Если вы используете IPSec сетевого уровня, то вы вообще не можете сказать.
Ответ №3:
Чтобы расширить старые ответы: предположим, что, имея необходимость настроить IPSec между двумя конечными точками, мы хотим знать, установлен ли он. Если используется шифрование по протоколу IPSec, это может быть лучшим решением (аппаратное шифрование, ключи, совместно используемые централизованно с другими службами на компьютере), но если шифрование по протоколу IPSec не применяется, нам лучше прервать соединение или использовать шифрование на уровне протокола приложения перед отправкой конфиденциальных данных.
К сожалению, не существует стандартного API для определения IPSec в сокете (и любая Java для этого должна взаимодействовать с собственными системными вызовами). Далее, обратите внимание, что IPSec может применяться маршрутизатором где-то по маршруту, прозрачно, поэтому его можно обнаружить, только если он применяется ядром ОС.
API:
- WSAQuerySocketSecurity
- setsockopt (sock, IPPROTO_IP, IP_SEC_OPT и opts) начиная с Solaris 8 (отличный учебник здесь)
- Шокирующе полностью (?) недокументированная IP_IPSEC_POLICY в Linux
- Хорошо документированная ПОЛИТИКА IP_IPSEC_POLICY во FreeBSD и macOS (с использованием хорошо зарекомендовавшей себя реализации KAME). Ищите примеры в /usr/src.