Tomcat中针对CRL的客户端证书验证的常用方法是什么?
A)一种可能的解决方案: 更新server.xml,设置连接器,设置密钥和信任存储,并且有crlList参数。
该方法存在两个问题:
1)维护列表 - 必须在Tomcat之外完成,Tomcat需要重新启动才能获取最新的
2)没有(或至少我能找到的方法)支持多个CA主体的crl列表,或者只是说 - 多个CR列表同时存在。
几年前我用Tomcat 5找不到“好”的解决方案。有关7的任何新闻吗?
B)是否有通用/优雅的方式来覆盖连接器处理程序和当前功能并提供自定义证书验证?
通过JBoss AS允许您这样做的方式,只需扩展现有的类,并为您提供定义自己的登录模块和自己的验证程序的可能性。
答案 0 :(得分:0)
您可以通过实施自己的TrustManager来实现此目的。请参阅HTTP连接器文档(http://tomcat.apache.org/tomcat-8.0-doc/config/http.html#SSL_Support)
中的trustManagerClassName属性答案 1 :(得分:0)
现在有了一种无需重新启动服务器即可选择最新CRL文件的方法。
他们介绍了两种名为:
的方法。可以通过多种方式调用它们:
方法1和方法2的详细信息可轻松在线获得。
有关使用方法3的详细信息:
在下面找到示例代码:
主协议类:
package com.myown.connector;
import java.io.File;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.net.URL;
import java.net.URLConnection;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ConcurrentMap;
import javax.management.MalformedObjectNameException;
import javax.management.ObjectName;
import javax.net.ssl.SSLSessionContext;
import org.apache.coyote.http11.Http11NioProtocol;
import org.apache.juli.logging.Log;
import org.apache.juli.logging.LogFactory;
import org.apache.tomcat.util.modeler.Registry;
import org.apache.tomcat.util.net.AbstractEndpoint;
import org.apache.tomcat.util.net.AbstractJsseEndpoint;
import org.apache.tomcat.util.net.GetSslConfig;
import org.apache.tomcat.util.net.SSLContext;
import org.apache.tomcat.util.net.SSLHostConfig;
import org.apache.tomcat.util.net.SSLHostConfigCertificate;
import org.apache.tomcat.util.net.SSLImplementation;
import org.apache.tomcat.util.net.SSLUtil;
public class ReloadProtocol extends Http11NioProtocol {
private static final Log log = LogFactory.getLog(Http12ProtocolSSL.class);
public ReloadProtocol() {
super();
RefreshSslConfigThread refresher = new
RefreshSslConfigThread(this.getEndpoint(), this);
refresher.start();
}
@Override
public void setKeystorePass(String s) {
super.setKeystorePass(s);
}
@Override
public void setKeyPass(String s) {
super.setKeyPass(s);
}
@Override
public void setTruststorePass(String p) {
super.setTruststorePass(p);
}
class RefreshSslConfigThread extends Thread {
AbstractJsseEndpoint<?> abstractJsseEndpoint = null;
Http11NioProtocol protocol = null;
public RefreshSslConfigThread(AbstractJsseEndpoint<?> abstractJsseEndpoint, Http11NioProtocol protocol) {
this.abstractJsseEndpoint = abstractJsseEndpoint;
this.protocol = protocol;
}
public void run() {
int timeBetweenRefreshesInt = 1000000; // time in milli-seconds
while (true) {
try {
abstractJsseEndpoint.reloadSslHostConfigs();
System.out.println("Config Updated");
} catch (Exception e) {
System.out.println("Problem while reloading.");
}
try {
Thread.sleep(timeBetweenRefreshesInt);
} catch (InterruptedException e) {
System.out.println("Error while sleeping");
}
}
}
}
}
server.xml中的连接器应将此作为协议提及:
<Connector protocol="com.myown.connector.ReloadProtocol"
..........
希望这会有所帮助。