gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 22:30:39 25 4
gpt4 key购买 nike

在 Tomcat 中根据 CRL 验证客户端证书的常用方法是什么?

  1. 一个可能的解决方案:
    更新server.xml,设置connector,设置key和trust store,有crlList参数。

    这种方法有两个问题:

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

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

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

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

    JBoss AS 允许您通过扩展现有类并让您定义自己的登录模块和验证器的可能性来实现。

最佳答案

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

他们介绍了 2 个名为:

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

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

  1. 使用jmx
  2. 使用经理服务
  3. 通过制定自定义协议(protocol) - 我在研究过程中发现了这种方式

方式 1 和方式 2 的详细信息很容易在线获得。

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

  1. 创建一个类来扩展您选择的协议(protocol),例如。 Http11NioProtocol
  2. 覆盖所需的方法并在其中调用 super 以保持默认行为
  3. 在该类中创建一个线程,定时调用reloadSslHostConfigs方法
  4. 把这个类打包成一个jar,然后把那个jar放到tomcat的lib文件夹中
  5. 在 server.xml 的连接器中编辑协议(protocol)以使用此自定义协议(protocol)

在下面找到示例代码:

主要协议(protocol)类:

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)提及:

<Connector protocol="com.myown.connector.ReloadProtocol"
...

希望这对您有所帮助。

关于tomcat - 根据 Tomcat 7 中的证书吊销列表验证客户端证书,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20286145/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com