要求浏览器不缓存证书
Require browser to not cache certificates
我们已经在 localhost:8081 设置了一个服务器,这将是我们的默认网站。然后我们在 8443 上打开了一个需要证书的 https 端口。第一次有对该端口的请求 Chrome/Edge 显示一个带有可用证书的弹出对话框(在我们的例子中为 1)。然后我们有一个程序可以启动其他授权,使证书可用,以便浏览器可以将其发送到服务器。但是,如果我们第二次尝试连接到该端口,浏览器似乎已经缓存了证书并将其发送到服务器而不显示弹出对话框。我们肯定已经使服务器端的所有会话无效。似乎重新提示证书的唯一方法是重新启动浏览器或隐身。有没有办法强制浏览器不缓存证书?
我已经通过做两件事设法解决了这个问题,在此之前我只想澄清一下我们在做什么。我们有一张检测卡片的智能卡 reader。如果插入卡,chrome 显示证书对话框。选择证书后,智能卡 reader 通过 pin 对话框验证卡并将卡证书发送到服务器。如果卡被移除并重新插入,它应该重新提示 pin 对话框,但在我们的例子中它没有,因为 chrome/edge 缓存了会话。
我们正在使用 Spring 启动 Apache 并执行以下操作解决了我们的问题:
在请求处理程序中使用 httpResponse.addHeader("Connection","close"):
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;
}
我们已经在 localhost:8081 设置了一个服务器,这将是我们的默认网站。然后我们在 8443 上打开了一个需要证书的 https 端口。第一次有对该端口的请求 Chrome/Edge 显示一个带有可用证书的弹出对话框(在我们的例子中为 1)。然后我们有一个程序可以启动其他授权,使证书可用,以便浏览器可以将其发送到服务器。但是,如果我们第二次尝试连接到该端口,浏览器似乎已经缓存了证书并将其发送到服务器而不显示弹出对话框。我们肯定已经使服务器端的所有会话无效。似乎重新提示证书的唯一方法是重新启动浏览器或隐身。有没有办法强制浏览器不缓存证书?
我已经通过做两件事设法解决了这个问题,在此之前我只想澄清一下我们在做什么。我们有一张检测卡片的智能卡 reader。如果插入卡,chrome 显示证书对话框。选择证书后,智能卡 reader 通过 pin 对话框验证卡并将卡证书发送到服务器。如果卡被移除并重新插入,它应该重新提示 pin 对话框,但在我们的例子中它没有,因为 chrome/edge 缓存了会话。 我们正在使用 Spring 启动 Apache 并执行以下操作解决了我们的问题:
在请求处理程序中使用 httpResponse.addHeader("Connection","close"):
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;
}