2012-03-19 1 views
4

Я успешно запускаю Netty с двухсторонним SSL (см. Set up Netty with 2-way SSL Handsake (client and server certificate)).Как я могу получить сертификат клиента в обработчике Netty для идентификации пользователя?

Однако в некоторых из моих обработчиков мне нужно знать о пользователе, который использует приложение. Я обнаружил, что не могу понять, как получить информацию, такую ​​как DN сертификата пользователя в моих обработчиках.

Я бы подумал, что он будет доступен в ChannelHandlerContext где-то, но это не так. Какие-либо предложения?

Я знаю, что SSLEngine имеет к нему доступ где-то, но я ничего не вижу о получении доступа в публичном API SSLEngine. Я знаю, что у него есть доступ к рукопожатию ... но как мне его получить?

ответ

7

SSLEngine.getSession().getPeerCertificateChain(). Заглавная запись - это собственный сертификат партнера.

+0

Это действительно решить эту проблему. Спасибо! – CStepnitz

+0

Играйте! Framework использует netty в своем фоне, и я хочу сертификат клиента SSL, как я могу получить текущий SSLEngine? –

8

The SSLEngine может быть извлечена через Pipline/ChannelHandlerContext

ChannelHandlerContext ctx = ... 
SslHandler sslhandler = (SslHandler) ctx.channel().pipeline().get("ssl"); 
sslhandler.engine().getSession().getPeerCertificateChain()[0].getSubjectDN()); 

Это позволяет получить сертификаты в обработчике объектов. Обратите внимание, что SSL-Handshake необходимо завершить, когда вы это сделаете. В противном случае вы получите

javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated 

исключение. Чтобы избежать этого, вы можете слушать для userEvent (в нашем случае HandshakeCompletionEvent) в обработчик, который может выглядеть следующим образом:

@Override 
public void userEventTriggered(ChannelHandlerContext ctx, Object evt) { 
    logger.info("userEventTriggered: {0}, Class: {1}", evt.toString(), evt.getClass()); 

    if (evt instanceof HandshakeCompletionEvent) { 
     fetchCertificate(ctx); 
    } 
}