Как получить принципала после успешного рукопожатия SSL с помощью Mina?

Я использую Mina с SslFilter, настроенным на «требуется аутентификация клиента».

Как только соединение установлено и выполнено рукопожатие, как получить сертификат (или принципал) однорангового узла на другой стороне соединения из моего подкласса IoHandler на сервере?

Изменить: другими словами, как установить связь между IoSession и принципалом после выполнения рукопожатия и вызова IoHandler.sessionOpened().


person Vincent Cantin    schedule 25.07.2011    source источник


Ответы (2)


Похоже, вы можете получить SSLSession с помощью SslFilter.getSslSession(...). Затем используйте SSLSession.getPeerCertificateChain(), чтобы получить цепочку сертификатов клиента. Фактический сертификат клиента находится в позиции 0 в этом массиве.

person Bruno    schedule 25.07.2011
comment
Похоже на решение. Позвольте мне сначала попробовать, тогда я приму это. Спасибо. - person Vincent Cantin; 25.07.2011
comment
SslFilter.getSslSession() при вызове из IoHandler.sessionOpened() возвращает значение null. Вероятно, этот метод вызывается сразу после установления сокетного соединения. Я не знаю, как получить уведомление после окончания рукопожатия. Не могли бы вы мне помочь, пожалуйста? - person Vincent Cantin; 26.07.2011
comment
Я не уверен. Не думайте, что вам нужно принять ответ, если он на самом деле не полностью отвечает на вопрос. Как предположение, посмотрев на javadoc, я бы попытался установить атрибут USE_NOTIFICATION и найти сообщение SESSION_SECURED. - person Bruno; 26.07.2011
comment
Это работает, но это трюк, который не очень хорошо документирован. Кроме того, мне нужно добавить два if в мой подкласс IoHandler.messageReceived(), чтобы отличать события от сообщений, действительно отправленных удаленным узлом, что не очень эффективно для ЦП. Интересно, есть ли лучший способ разработать прослушиватель событий. - person Vincent Cantin; 26.07.2011

Вы не работаете с IoHandler напрямую для этого, это делается с помощью SSLContext, который необходимо предоставить для SslFilter конструктор. Если вы посмотрите на эхо-сервер например, вы можете видеть, что фактическая проверка выполняется в DefaultTrustManagerFactory. Лично я нахожу этот пример слишком сложным, если я найду что-нибудь попроще, я опубликую его.

person prusswan    schedule 25.07.2011
comment
Я уже написал свой собственный TrustManagerFactory, который я установил в SSLContext, который я предоставляю SslFilter через его конструктор. Мой TrustManager вызывается, когда кто-то подключается, эта часть в порядке. Что мне нужно знать, так это то, как получить связь между IoSession и сертификатом другого узла (или принципалом) после выполнения рукопожатия. - person Vincent Cantin; 25.07.2011