簡體   English   中英

如何在配置了SSL的tomcat中緩存和更新CRL(證書吊銷列表)/ OCSP響應?

[英]How to cache and update CRL (certificate revokation list)/OCSP responses in SSL configured tomcat?

我一直在嘗試在Tomcat 8中設置SSL / TLS握手。我已經成功完成了所有配置,但是CRL / OCSP面臨一些問題。

我需要的解決方案:

我有幾個問題,請耐心等待。 任何幫助將非常感激。

  1. tomcat 8是否允許我們緩存從CRL分發點獲得的CRL文件? 緩存是指如果網絡不可用並且我們啟動服務器,那么我不希望tomcat默認允許所有用戶訪問(這樣做),因為CRL分發點不可用。 我希望它緩存最后一個可用列表,並在無法立即下載CRL時使用它。 如果可以下載,則更新現有緩存。

我在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配置來實現嗎?

  1. 我找到了一種方法來實現上述任務,我的操作找到了Java代碼在這里

問題是,我必須在握手到此Java代碼時發送客戶端證書,並基於此代碼的回復接受/拒絕證書。 我不知道該怎么做。 任何幫助都會很有用。 第二個原因是我更喜歡使用tomcat配置而不是自定義代碼來完成任務1,因為自定義代碼在某些方面可能會遺漏。

  1. 是否可以在不重新啟動tomcat服務器的情況下從CRL分發URL動態選擇更新的CRL? 具有上述配置的當前方案在服務器打開時選擇一次CRL文件,然后即使URL上可用的CRL列表已更改,它也僅使用該副本。

  2. 我們可以在連接器中配置多個CRL端點嗎? Tomcat將檢查所有這些內容,並根據來自所有URL的組合列表接受/拒絕客戶端證書。

    1. 如果已配置,是否可以以與我要緩存CRL列表類似的方式來緩存OCSP響應?

提前致謝。 請隨時詢問我可能錯過的任何詳細信息。

回答我自己的問題。

我可以找到一種緩存CRL的方法。 我所做的是在server.xml中使連接器的crlFile指向本地計算機上的CRL文件。 我會不時使用CRON作業來更新此文件。

從Tomcat v8.5.24開始,已添加新的API以刷新整個SSL配置,而無需重新啟動Tomcat服務器。 我也不時調用這些API,以從本地計算機中選擇更新的CRL文件。

他們介紹了兩種名為:

  1. reloadSslHostConfig(String hostName)-重新加載特定的主機
  2. reloadSslHostConfigs()-重新加載全部

可以通過多種方式調用它們:

  1. 使用jmx
  2. 使用經理服務
  3. 通過制定自定義協議-我在研究期間發現了這種方式

方法1和方法2的詳細信息可輕松在線獲得。

如何使用方式3的詳細信息:

  1. 制作一個類,擴展您選擇的協議,例如。 Http11NioProtocol
  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"
 ..........

希望這對某人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM