Netty https (TLS) Продолжительность сеанса: зачем нужно повторное согласование - PullRequest
5 голосов
/ 04 января 2012

У меня 100% веб-сервер https, который выполняет пересмотр TLS.Это очень полезно для того, чтобы пользователи могли зайти на сайт и получить несколько хороших страниц, прежде чем нажать кнопку входа в систему и попросить сертификат клиента.Ниже приведена часть кода, которая выполняет повторное согласование строки 213-236 класса X509Cert

import org.jboss.netty.handler.ssl.SslHandler

val sslh = r.underlying.context.getPipeline.get(classOf[SslHandler])

trySome(sslh.getEngine.getSession.getPeerCertificates.toIndexedSeq) orElse {
  if (!fetch) None
  else {
    sslh.setEnableRenegotiation(true) // todo: does this have to be done on every request?
    r match {
      case UserAgent(agent) if needAuth(agent) => sslh.getEngine.setNeedClientAuth(true)
      case _ => sslh.getEngine.setWantClientAuth(true)
    }
    val future = sslh.handshake()
    future.await(30000) //that's certainly way too long.
    if (future.isDone && future.isSuccess)
      trySome(sslh.getEngine.getSession.getPeerCertificates.toIndexedSeq)
    else
      None
  }
}

Теперь я ожидал, что, как только кто-то аутентифицируется с помощью сертификата клиента X509, сеанс будетНемного времени и помните эту цепочку сертификатов - скажем, 10 минут или больше, и в любом случае, по крайней мере, 1 минуту.Действительно, именно поэтому у меня есть возможность вызывать вышеупомянутый метод с переменной «fetch», установленной в false.Я надеюсь, что если кто-то подтвердил подлинность, соединение не должно быть пересмотрено.

Но я заметил, что в большинстве браузеров мне нужно каждый раз вызывать sslh.handshake (), если я хочу получить сеанс и вернуть сертификаты X509.Если для «fetch» ​​задано значение «false», то в большинстве случаев мне возвращается «Нет».

Это нормально, или я что-то не так делаю?

PS.

  • приведенный выше код является частью реализации протокола WebID
  • Это использует netty 3.2.5Final.Я также попытался с 3.2.7Final без особой удачи.
  • Поэтому мне пришлось изменить код текущей службы , выполняющей вышеуказанный код , чтобы она всегда вызвала рукопожатие (см. коммит ) Но это не дает мне такой гибкости, как я надеялся.

1 Ответ

3 голосов
/ 11 марта 2012

Оказывается, у меня были проблемы с использованием netty без фильтрации.Я нашел это при реализации того же на Play 2.0.

См. отчет об ошибке 215 на Play2.0 и на нефильтрованной ошибка 111: безопасная нетти создает новые контексты TLS для каждого соединения

...