我们已经在localhost:8081设置了一个服务器,这将是我们的默认网站。然后,我们在8443上打开了一个https端口,这需要一个证书。第一次出现对该端口的请求时,Chrome/Edge会显示一个具有可用证书的弹出对话框(在本例中为1)。然后,我们有一个程序,在其中执行其他授权,使证书可用,以便浏览器可以将其发送到服务器。但是,如果我们第二次尝试连接到该端口,浏览器似乎已经缓存了证书并将其发送到服务器,而没有显示弹出对话框。我们肯定会使服务器端的所有会话失效。重新提示证书的唯一方法似乎是重新启动浏览器或隐匿。有没有办法强迫浏览器不缓存证书?
发布于 2021-11-08 16:39:32
我做了两件事来解决这个问题,在此之前,我只想澄清我们在做什么。我们有一个智能卡读卡器可以探测到一张卡片。如果插入卡,则铬显示证书对话框。在选择证书后,智能卡读取器通过引脚对话框对卡进行身份验证,并将卡片证书发送到服务器。如果卡被移除并重新插入,它应该重新提示pin对话框,但是在我们的例子中,它没有,因为chrome/edge缓存了会话。我们在Apache中使用Spring引导,并执行以下操作解决了我们的问题:
在请求者使用httpResponse.addHeader(“连接”,“关闭”)
private void handleSessionUnlockRequest(HttpServletRequest httpRequest, HttpServletResponse httpResponse) throws IOException {
...
...
httpResponse.addHeader("Access-Control-Allow-Credentials",
"true");
httpResponse.addHeader("Cache-Control",
"no-cache, no-store, max-age=0, must-revalidate");
httpResponse.addHeader("Connection","close");
writer.flush();
httpRequest.getSession().invalidate();
}在HttpConnector设置hostConfig.setSessionTimeout(1)
private Connector getHttpConnector() {
Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
Http11NioProtocol protocol = (Http11NioProtocol) connector.getProtocolHandler();
connector.setScheme("https");
connector.setSecure(true);
...
...
protocol.setSslEnabledProtocols("TLSv1.2");
protocol.setClientAuth("Required");
for(SSLHostConfig hostConfig : connector.findSslHostConfigs()){
hostConfig.setSessionTimeout(1);
}
return connector;
}https://stackoverflow.com/questions/69741301
复制相似问题