Безопасные TCP-соединения в Java - PullRequest
7 голосов
/ 02 июля 2011

Мне было интересно, как лучше защитить TCP-соединение в Java. Я хочу, чтобы связь с моим сервером осуществлялась только от аутентифицированных клиентов и, где возможно, шифровала передаваемые данные.

Какие проблемы мне понадобятся, чтобы следить за ними и какие технологии я могу использовать?

Спасибо

Тим.

Ответы [ 4 ]

3 голосов
/ 02 июля 2011

Java предлагает расширение защищенных сокетов, то есть JSSE , которое поддерживает SSLv3 и TLS.
Он спроектирован так, что ваш код похож на обработку обычных сокетов.
Вы просто инициализируете SSLContext и настраиваете его для использования используемых сертификатов и различных параметров, например, аутентификация клиента, прослушиватель рукопожатия и т. д., остальное обрабатывается прозрачно.
Прочитайте учебник, чтобы начать на нем.

2 голосов
/ 02 июля 2011

Обычным способом будет SSL, как уже говорилось.Это поддерживает (обязательную) аутентификацию и шифрование сервера по умолчанию, аутентификация клиента является необязательной (например, в зависимости от конфигурации - сервер может убедиться, что клиенты аутентифицированы).

В Java вы можете использовать SSLSocket (и SSLServerSocket)(или соответствующие фабричные классы), или SSLEngine (если вы хотите сделать неблокирующий ввод-вывод).Или какой-то API более высокого уровня, который использует это под прикрытием.

Другой вариант - протокол SSH .Это позволяет зашифрованное и (обычно) аутентифицированное соединение с обеих сторон, по которому можно маршрутизировать несколько каналов .Это обычно используется для удаленного выполнения команд или передачи файлов, но также позволяет переадресацию портов.

В Java это может быть реализовано (на стороне клиента), например, JSch .Я не знаю ни одной реализации Java на стороне сервера, но вы можете использовать обычный сервер OpenSSH и перенаправить порты на ваш процесс Java-сервера.

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

Вы должны спросить себя, от чего вы защищаете. Если вы хотите разрешить только аутентичные клиенты, вам нужно определить, как вы это определяете. Если вы разрешаете трафик в незашифрованном виде, это небезопасно, поскольку любой посредник сможет изменить трафик. Как минимум, вам нужна защита целостности данных, которыми вы обмениваетесь.

Я бы согласился с большинством людей, что SSL - это, вероятно, самый простой подход для этого. Вам нужно будет использовать клиентские сертификаты для проверки подлинности клиентской части соединения. У вас есть два подхода к использованию клиентских сертификатов:

  • создать самоподписанный сертификат для каждого клиента, затем сохранить базу данных сертификата хэш-> сопоставления клиента и запросить базу данных во время проверки сертификата клиента
  • в качестве альтернативы, создайте свой собственный сертификат корневого ЦС и выдайте каждому клиенту сертификат, затем вам необходимо убедиться, что сертификат клиента правильно связан с сертификатом корневого ЦС при выполнении проверки сертификата клиента

Выбор того, какой подход выбрать, полностью за вами и в равной степени безопасен. Выберите дизайн, который наилучшим образом соответствует вашему текущему проекту.

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

SSL действительно хорошо поддерживается (в конце концов, он используется в HTTPS). Основанный на Keyli Key Infrastructure, он предлагает различные схемы шифрования и аутентификации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...