Java tutorial
/* * File: CrlCache.java * * Created on Apr 19, 2008 * * * Copyright 2006-2007 Felix Garcia Borrego (borrego@gmail.com) * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ package org.viafirma.nucleo.validacion; import java.security.cert.CRL; import java.security.cert.X509CRL; import java.security.cert.X509Certificate; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.commons.collections.map.HashedMap; import org.apache.commons.lang.time.DateUtils; import com.viavansi.framework.core.util.FechaUtilities; import net.sf.ehcache.Cache; /** * Implementa un sistema de cache basado en el NetUpdate de la CRL . * NOTA: Mantiene en memoria todas las CRLs utilizadas. * @author Felix Garcia Borrego (borrego@gmail.com) */ public class CrlCache { /** * Cache sincronizada con el listado de crls asociado a los certificados. * */ private Map<String, List<X509CRL>> cacheCrlsForCertificate; /** * */ private CrlCache() { // Creamos la cache sincronizada. cacheCrlsForCertificate = Collections.synchronizedMap(new HashMap<String, List<X509CRL>>()); } private static CrlCache singleton; /** * Retorna una instancia de la Cache de CRLs. * @return */ public static CrlCache getInstance() { if (singleton == null) { singleton = new CrlCache(); } return singleton; } /** * Retorna las crls asociadas al certificado actual en caso de que existan y no esten caducadas. * * @param certificadoX509 Certificado para el que deseamos recuperar las crls. * @return Listado de crls asociado, null si no hay crls vlidas asociadas. */ public List<X509CRL> getCrlsFrom(X509Certificate certificadoX509) { String name = certificadoX509.getSubjectDN().getName(); if (cacheCrlsForCertificate.containsKey(name)) { // Hay CRLs en la cache. comprobamos que su validez es correcta. List<X509CRL> listTemp = cacheCrlsForCertificate.get(name); if (listTemp.isEmpty()) { // No hay crls asociadas a este certificado. return null; } else { Date ahora = new Date(); // Comprobamos que todas las CRLS estan en fecha correcta for (X509CRL crl : listTemp) { Date nextUpdate = crl.getNextUpdate(); // Si la crl no informa de su proxima actualizacin requerida o la actualizacin ya es necesaria if (nextUpdate == null || nextUpdate.compareTo(ahora) < 0) { // Algunas de las crls asociadas a este certificado estan caducadas, // Las eliminamos de la cache para que se fuerce su recarga. cacheCrlsForCertificate.remove(name); return null; } } // OK. Existen Crls y no estan caducadas. return listTemp; } } else { return null; } } /** * Aadimos una nueva crl a la cache. * @param certificadoX509 * @param listCRLs */ public void addToCache(X509Certificate certificadoX509, List<X509CRL> listCRLs) { String name = certificadoX509.getSubjectDN().getName(); cacheCrlsForCertificate.put(name, listCRLs); } }