У меня есть 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. Если для «выборки» установлено значение false, то в основном я получаю None.
Это нормально, или я что-то не так делаю?
PS.
- приведенный выше код является частью реализации протокола WebID.
- Это использует netty 3.2.5Final. Я также пробовал с 3.2.7Final без особого успеха.
- Поэтому мне пришлось изменить код текущей службы, выполняющей приведенный выше код, чтобы он всегда принудительно рукопожатие (см. коммит) Но это не дает мне такой гибкости, на которую я надеялся.