1

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

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

这种方法有两个问题:

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

2)没有(或至少我能找到的)方法来支持多个 CA 机构的 crl 列表,或者只是说 - 同时多个 CR 列表。

几年前,我无法使用 Tomcat 5 找到“好的”解决方案。关于 7 的任何消息?

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

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

4

2 回答 2

0

您可以通过实现自己的 TrustManager 来做到这一点。请参阅 HTTP 连接器文档中的 trustManagerClassName 属性 ( http://tomcat.apache.org/tomcat-8.0-doc/config/http.html#SSL_Support )

于 2013-11-29T14:22:51.690 回答
0

现在有一种方法可以在不重新启动服务器的情况下选择最新的 CRL 文件。

他们引入了 2 种方法,命名为:

  1. reloadSslHostConfig(String hostName) - 重新加载特定主机
  2. reloadSslHostConfigs() - 重新加载所有

可以通过多种方式调用它们:

  1. 使用 jmx
  2. 使用经理服务
  3. 通过制作自定义协议 - 我在研究期间发现了这种方式

方式 1 和方式 2 的详细信息可轻松在线获得。

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

  1. 制作一个扩展您选择的协议的类,例如。Http11Nio协议
  2. 覆盖所需的方法并在其中调用 super 以保持默认行为
  3. 在这个类中创建一个线程来定时调用 reloadSslHostConfigs 方法
  4. 将这个类打包到一个jar中,然后把那个jar放到tomcat的lib文件夹中
  5. 在 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"
 ..........

希望这可以帮助。

于 2018-07-27T06:56:23.393 回答