0

Я планирую сделать настольное приложение для безопасного обмена файлами в Java. Приложение нуждается в надежном методе аутентификации, который должен гарантировать, что только авторизованные пользователи обращаются к системе.Аутентификация на основе сертификатов

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

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

Я думаю, что у меня есть правильная идея, но я не знаю, как начать реализацию на Java. Можете ли вы, ребята, дать мне несколько указателей или исправить мои идеи, если вы думаете, что я немного смущен?

+0

Вы спрашиваете о реализации, чтобы я голосовал, чтобы перенести это на SO. – Ayrx

+0

Почему вы строите новый протокол authn вместо использования TLS или SSH, оба из которых могут выполнять cert authn? Почему бы просто не сохранить действительные сертификаты authz'd на сервере служб или разрешить подписанные сертификаты и управлять списком аннулирования? Вы авторизуете клиента на ключевом сервере, но он не кажется ничем иным ... Как клиентский сервер аутентификации клиента? Как сервер авторизации клиента? Как сервер сервера авторизации сервера? Как работает сервер обслуживания сервера? Что вы делаете, чтобы предотвратить повтор подписи? Зачем вам нужен промежуточный сервер для хранения сертификата x509 вместо его хранения? – atk

+0

Это проект колледжа, и мы не должны использовать TLS или SSH, я думаю. В любом случае, я получил ваше мнение, я должен хранить авторизованные сертификаты на центральном сервере. Клиент сможет аутентифицировать центральный сервер, потому что этот центральный сервер также имеет сертификат, выданный тем же ЦС. Протокол, который я должен использовать, - «Станция-Станция». – wolvz

ответ

2

В вашем сценарии я действительно не вижу смысла в том, что центр сертификации подписывает сертификат x509. Он чувствует себя излишне сложным, поскольку нет необходимости в цепочке доверия.

Вместо этого я хотел бы использовать что-то вроде SSH-ключей для аутентификации, например, что делает git.

+0

В обмене файлами с участием двух пользователей они запрашивают сертификат x509 друг на друга на центральный сервер и подписывают подписки, поэтому могут быть уверены, что они общаются с кем-то, кто является частью системы (защита от MITM). Вот почему мне нужен CA. – wolvz

1

Я согласен с Терри Чиа, что клиентский SSL SSL даст вам быстрый и простой способ получить то, что вы хотите. Настройте свой веб-сервер с помощью SSL и, в частности, проверку подлинности клиента и предоставите доверенные ЦС, которые администратор будет использовать для подписания одобренных сертификатов.

Приложение Java должно будет использовать библиотеку SSL и иметь доступ к способу установки учетных данных для библиотеки. Я думаю, что по умолчанию libary для SSL в Java может это сделать и может использовать X509Certificate в качестве способа указания учетных данных.

В моем описании что-то странное в том, что клиент не отправляет свой сертификат с доказательством закрытого ключа (независимо от того, подписываете ли вы его или используете SSL, есть доказательство закрытого ключа в качестве сигнатуры или SSL рукопожатие). Гораздо более типично, чтобы клиент сказал: «Это я, и вот доказательство» - то есть предоставить сертификат X509 и доказательство закрытого ключа. Я подозреваю, что сервер * мог • искать учетные данные на основе открытого ключа, но он был бы менее эффективным.

Смежные вопросы