[英]Certificate chain validation using java, checking revokation and OCSP status
[英]How to cache and update CRL (certificate revokation list)/OCSP responses in SSL configured tomcat?
我一直在尝试在Tomcat 8中设置SSL / TLS握手。我已经成功完成了所有配置,但是CRL / OCSP面临一些问题。
我需要的解决方案: 这
我有几个问题,请耐心等待。 任何帮助将非常感激。
我在server.xml中配置了连接器。
<Connector protocol="org.apache.coyote.http11.Http11NioProtocol" port="8443" maxThreads="2000" clientAuth="want" scheme="https" keepAliveTimeout="-1" connectionTimeout="900000" compression="on" noCompressionUserAgents="gozilla, traviata" compressableMimeType="text/html,text/xml,text/css,text/javascript,image/jpg,image/ico,image/png,image/jpeg,image/tiff,image/tif" secure="true" SSLEnabled="true" sslProtocol="TLS" sessionTimeout="30" truststoreFile="D:\\Certs\\server.truststore" truststorePass="123456" keystoreFile="D:\\Certs\\keystore.pkcs12" keystorePass="password" keystoreType="PKCS12" crlFile="http://127.0.0.1:8600/getCRLFile/" maxKeepAliveRequests="200" sslEnabledProtocols= "TLSv1,TLSv1.1,TLSv1.2" maxHttpHeaderSize="65536" maxPostSize="4194304" ciphers="TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA"/>
我可以使用任何tomcat配置来实现吗?
问题是,我必须在握手到此Java代码时发送客户端证书,并基于此代码的回复接受/拒绝证书。 我不知道该怎么做。 任何帮助都会很有用。 第二个原因是我更喜欢使用tomcat配置而不是自定义代码来完成任务1,因为自定义代码在某些方面可能会遗漏。
是否可以在不重新启动tomcat服务器的情况下从CRL分发URL动态选择更新的CRL? 具有上述配置的当前方案在服务器打开时选择一次CRL文件,然后即使URL上可用的CRL列表已更改,它也仅使用该副本。
我们可以在连接器中配置多个CRL端点吗? Tomcat将检查所有这些内容,并根据来自所有URL的组合列表接受/拒绝客户端证书。
提前致谢。 请随时询问我可能错过的任何详细信息。
回答我自己的问题。
我可以找到一种缓存CRL的方法。 我所做的是在server.xml中使连接器的crlFile指向本地计算机上的CRL文件。 我会不时使用CRON作业来更新此文件。
从Tomcat v8.5.24开始,已添加新的API以刷新整个SSL配置,而无需重新启动Tomcat服务器。 我也不时调用这些API,以从本地计算机中选择更新的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"
..........
希望这对某人有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.