根据Tomcat 7中的证书吊销列表验证客户端证书

根据Tomcat 7中的证书吊销列表验证客户端证书,tomcat,ssl-certificate,certificate-revocation,Tomcat,Ssl Certificate,Certificate Revocation,Tomcat中针对CRL的客户端证书验证的常用方法是什么 一种可能的解决办法: 更新server.xml,设置连接器,设置密钥和信任存储,并且有crlList参数 这种方法有两个问题: 1列表维护-必须在Tomcat之外完成,Tomcat需要重新启动以获取最新的列表 2我找不到或至少找不到一种方法来支持多个CA机构的crl列表,或者只是说——同时支持多个CR列表 几年前,我用Tomcat5找不到好的解决方案。7号有什么消息吗 B是否有通用/优雅的方法覆盖连接器处理程序和当前功能,并提供自定义证书

Tomcat中针对CRL的客户端证书验证的常用方法是什么

一种可能的解决办法: 更新server.xml,设置连接器,设置密钥和信任存储,并且有crlList参数

这种方法有两个问题:

1列表维护-必须在Tomcat之外完成,Tomcat需要重新启动以获取最新的列表

2我找不到或至少找不到一种方法来支持多个CA机构的crl列表,或者只是说——同时支持多个CR列表

几年前,我用Tomcat5找不到好的解决方案。7号有什么消息吗

B是否有通用/优雅的方法覆盖连接器处理程序和当前功能,并提供自定义证书验证


JBossAS允许您这样做,只需扩展现有类,并允许您定义自己的登录模块和验证器。

您可以通过实现自己的TrustManager来实现这一点。请参阅HTTP connector文档中的trustManagerClassName属性,现在可以在不重新启动服务器的情况下选择最新的CRL文件

他们介绍了两种方法,名为:

ReloadsLHOSTConfigString主机名-重新加载特定主机 reloadslhostconfigs-全部重新加载 它们可以用多种方式调用:

使用jmx 使用管理器服务 通过定制协议——我在研究中发现了这种方法 道路1和道路2的详细信息可在网上轻松获取

有关如何使用方式3的详细信息:

创建一个扩展您选择的协议的类,例如Http11NioProtocol 重写所需的方法并在其中调用super以保持默认行为 在此类中创建一个线程,以不时调用ReloadsLHostConfigs方法 将这个类打包到一个jar中,并将这个jar放在tomcat的lib文件夹中 在server.xml中的连接器中编辑协议以使用此自定义定义的协议 请在下面查找示例代码:

主要协议类别:

    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"
 ..........

希望这有帮助

好的,谢谢。这是一条路要走。很久以前我就已经在JBoss上做过类似的事情,但是如果有现成的解决方案,或者至少是标准的方法,我会更高兴。tomcat服务器在默认情况下从CA下载一次CRL列表后,是否会在本地缓存或存储一段时间?我们需要为实现CRL缓存配置更多吗?只是晚了5年。。。谢谢你的回答,我会接受这个,因为我不希望有任何新的弹出窗口,尽管我目前无法测试它