Код, который получает сертификат, в конечном итоге вызывает org.apache.tomcat.util.net.jsse.JSSESupport.getPeerCertificateChain(...)
.Однако повторное согласование инициируется только в том случае, если сертификат еще не был связан с сеансом:
if(jsseCerts.length <= 0 && force) {
session.invalidate();
handShake();
session = ssl.getSession();
}
Следовательно, поскольку у вас уже есть сертификат с SSLSession
(и после удаления атрибутаиз-за того, что запрос не повлияет на это), вы не сможете инициировать повторное согласование, которое заставит вас забыть этот сертификат.
Может возникнуть необходимость исправления реализации различных классов вTomcat (этот вызов getPeerCertificateChain
) для достижения этой цели.Это то, что вам нужно сделать, если вы хотите выполнить «выход из SSL» (что аналогично).Вы можете попросить клиента закрыть соединение (и, таким образом, создать новое соединение, которое будет согласовано без сертификата клиента), используя HTTP-заголовок Connection: close
.Тем не менее, поскольку обычно отправитель отправляет его завершающей стороне, не гарантируется, что получатель (клиент) закроет его (и опять же, насколько я знаю, в спецификации сервлета и в реализации Tomcat нет ничего,что позволяет использовать для принудительного закрытия соединения).