Changeset 12


Ignore:
Timestamp:
11-08-09 16:53:03 (10 years ago)
Author:
matthijsln
Message:

filter voor checken client certificate toegevoegd

Location:
openwion-service/trunk
Files:
1 added
2 edited
1 moved

Legend:

Unmodified
Added
Removed
  • openwion-service/trunk/src/java/nl/openwion/klic/security/KlicSecurityInitializerServlet.java

    r11 r12  
    1111 
    1212/** 
    13  * Servlet die KlicSSLContextBuilder initialiseert, doordat dit een Servlet is 
    14  * kan gebruik worden gemaakt van servlet init-params uit web.xml. 
     13 * Dit servlet initialiseert een KeyStore met de CA certificaten van PKIoverheid. 
     14 * 
     15 * Doordat dit een Servlet is kan gebruik worden gemaakt van servlet init-params 
     16 * uit web.xml. De checks voor de Subject DN van het server certificaat van 
     17 * de web services van Kadaster is een init-param van dit servlet. Dit servlet 
     18 * initialiseert daarmee ook KlicSSLContextBuilder. 
     19 * 
     20 * De PKIoverheid keystore wordt gebruikt door KlicClientCertificateFilter voor 
     21 * het verifieren van client certificaten. Dit Filter heeft eigen init-params 
     22 * voor de checks op de Subject DN. 
    1523 */ 
    16 public class KlicSSLContextBuilderInitializerServlet implements Servlet { 
     24public class KlicSecurityInitializerServlet implements Servlet { 
    1725 
    1826    private static final String PARAM_KEYSTORE_PATH = "keyStore"; 
    1927    private static final String PARAM_KEYSTORE_PASS = "keyStorePass"; 
    20     private static final String PARAM_SUBJECT_DN_CHECKS = "subjectDistinguishedNameChecks"; 
     28    private static final String PARAM_SERVER_SUBJECT_DN_CHECKS = "serverSubjectDistinguishedNameChecks"; 
    2129 
    2230    private ServletConfig config; 
     31 
     32    private KeyStore pkiOverheidKeyStore; 
    2333 
    2434    public void init(ServletConfig config) throws ServletException { 
     
    3444        } 
    3545 
    36         String subjectDNChecks = config.getInitParameter(PARAM_SUBJECT_DN_CHECKS); 
     46        String subjectDNChecks = config.getInitParameter(PARAM_SERVER_SUBJECT_DN_CHECKS); 
    3747        String[] subjectDNSearchStrings = null; 
    3848        if(subjectDNChecks != null) { 
     
    5666        } 
    5767 
     68        pkiOverheidKeyStore = ks; 
     69 
    5870        try { 
    5971            KlicSSLContextBuilder.initContext(ks, subjectDNSearchStrings); 
    6072        } catch(Exception e) { 
    6173            throw new ServletException("Error initializing KlicSSLContextBuilder", e); 
     74        } 
     75 
     76        try { 
     77            KlicClientCertificateFilter.initWithKeyStore(pkiOverheidKeyStore); 
     78        } catch(Exception e) { 
     79            throw new ServletException("Error initializing KlicClientCertificateFilter", e); 
    6280        } 
    6381    } 
     
    6886 
    6987    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { 
    70         throw new UnsupportedOperationException("This servlet has no services..."); 
     88        throw new UnsupportedOperationException(); 
    7189    } 
    7290 
  • openwion-service/trunk/src/java/nl/openwion/klic/security/KlicX509TrustManager.java

    r11 r12  
    1717 * http://java.sun.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html 
    1818 * 
     19 * Maakt geen onderscheid tussen client of server verificatie, gebruik daarvoor 
     20 * meerdere instanties van deze class. 
     21 * 
    1922 */ 
    2023public class KlicX509TrustManager implements X509TrustManager { 
    2124    /** 
    22      * De standaard PKIX X509TrustManager, delegeer het valideren van het server 
    23      * certificaat hier naar toe. 
     25     * De standaard PKIX X509TrustManager, delegeer het valideren van de  
     26     * geldigheid van het "certificate path to a trusted root" hier naar toe. 
    2427     */ 
    2528    private X509TrustManager pkixTrustManager; 
    2629 
    2730    /** 
     31     * Of bij het initialiseren wel een non-null KeyStore is meegegeven. Gebruikt 
     32     * om te checken of de TrustManager geinitialiseerd had moeten zijn. 
     33     */ 
     34    private boolean verifyWithPKIX; 
     35 
     36    /** 
    2837     * Strings die moeten voorkomen in de Distinguished Name (DN) van het 
    29      * Subject van het certificaat. Case insensitive. 
     38     * Subject van het certificaat. Case insensitive. Indien null wordt de DN 
     39     * niet gechecked. 
    3040     */ 
    3141    private String[] subjectDNSearchStrings; 
     
    3444     * @param ks KeyStore met CA certificaten. 
    3545     * @param subjectDNSearchStrings Strings die moeten voorkomen in de SubjectDN 
    36      *   van een server certificaat. 
     46     *   van een server certificaat.  
    3747     */ 
    3848    KlicX509TrustManager(KeyStore ks, String[] subjectDNSearchStrings) throws Exception { 
    3949        this.subjectDNSearchStrings = subjectDNSearchStrings; 
     50        this.verifyWithPKIX = ks != null; 
    4051 
    41         TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX"); 
    42         tmf.init(ks); 
     52        if(ks != null) { 
     53            TrustManagerFactory tmf = TrustManagerFactory.getInstance("PKIX"); 
     54            tmf.init(ks); 
    4355 
    44         TrustManager tms [] = tmf.getTrustManagers(); 
     56            TrustManager tms [] = tmf.getTrustManagers(); 
    4557 
    46          for(int i = 0; i < tms.length; i++) { 
    47              if(tms[i] instanceof X509TrustManager) { 
    48                  pkixTrustManager = (X509TrustManager)tms[i]; 
    49                  break; 
     58             for(int i = 0; i < tms.length; i++) { 
     59                 if(tms[i] instanceof X509TrustManager) { 
     60                     pkixTrustManager = (X509TrustManager)tms[i]; 
     61                     break; 
     62                 } 
    5063             } 
    51          } 
    5264 
    53         if(pkixTrustManager == null) { 
    54             throw new Exception("Initialisatiefout KlicX509TrustManager"); 
     65            if(pkixTrustManager == null) { 
     66                throw new Exception("Initialisatiefout KlicX509TrustManager"); 
     67            } 
     68        } 
     69    } 
     70 
     71    private void checkSubjectTrusted(X509Certificate[] chain) throws CertificateException { 
     72        if(chain == null || chain.length == 0) { 
     73            throw new CertificateException("no certificate chain"); 
     74        } 
     75         
     76        X500Principal subject = chain[0].getSubjectX500Principal(); 
     77 
     78        String name = subject.getName().toLowerCase(); 
     79 
     80        if(subjectDNSearchStrings != null) { 
     81            for(int i = 0; i < subjectDNSearchStrings.length; i++) { 
     82                if(name.indexOf(subjectDNSearchStrings[i].toLowerCase()) == -1) { 
     83                    String fout = "Certificaat niet vertrouwd; subject DN bevat niet " + 
     84                            "de tekenreeks \"" + subjectDNSearchStrings[i] + 
     85                            "\". Volledige DN van subject is \"" + subject.getName() + "\""; 
     86                    throw new CertificateException(fout); 
     87                } 
     88            } 
    5589        } 
    5690    } 
    5791 
    5892    public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
    59         pkixTrustManager.checkClientTrusted(chain, authType); 
     93        if(verifyWithPKIX) { 
     94            if(pkixTrustManager == null) { 
     95                throw new IllegalStateException("Initialization failed, check previous errors"); 
     96            } 
     97            pkixTrustManager.checkClientTrusted(chain, authType); 
     98        } 
     99 
     100        checkSubjectTrusted(chain); 
    60101    } 
    61102 
    62      public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
    63          pkixTrustManager.checkServerTrusted(chain, authType); 
     103    public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { 
     104        if(verifyWithPKIX) { 
     105            if(pkixTrustManager == null) { 
     106                throw new IllegalStateException("Initialization failed, check previous errors"); 
     107            } 
     108            pkixTrustManager.checkServerTrusted(chain, authType); 
     109        } 
    64110 
    65          X500Principal subject = chain[0].getSubjectX500Principal(); 
     111        checkSubjectTrusted(chain); 
     112    } 
    66113 
    67          String name = subject.getName().toLowerCase(); 
    68  
    69          if(subjectDNSearchStrings != null) { 
    70              for(int i = 0; i < subjectDNSearchStrings.length; i++) { 
    71                  if(name.indexOf(subjectDNSearchStrings[i].toLowerCase()) == -1) { 
    72                      String fout = "Server certificaat niet vertrouwd; subject DN bevat niet " + 
    73                             "de tekenreeks \"" + subjectDNSearchStrings[i] + 
    74                             "\". Volledige DN van subject is \"" + subject.getName() + "\""; 
    75                      throw new CertificateException(fout); 
    76                  } 
    77              } 
    78          } 
    79      } 
    80  
    81      public X509Certificate[] getAcceptedIssuers() { 
    82          return pkixTrustManager.getAcceptedIssuers(); 
    83      } 
     114    public X509Certificate[] getAcceptedIssuers() { 
     115        return pkixTrustManager.getAcceptedIssuers(); 
     116    } 
    84117} 
  • openwion-service/trunk/web/WEB-INF/web.xml

    r11 r12  
    22<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> 
    33    <display-name>OpenWION webservice</display-name> 
     4    <filter> 
     5        <filter-name>KlicClientCertificateFilter</filter-name> 
     6        <filter-class>nl.openwion.klic.security.KlicClientCertificateFilter</filter-class> 
     7        <init-param> 
     8            <param-name>verifyCertificateCA</param-name> 
     9            <param-value>true</param-value> 
     10        </init-param> 
     11        <!--init-param> 
     12            <param-name>clientSubjectDistinguishedNameChecks</param-name> 
     13            <param-value>O=Dienst voor het kadaster en de openbare registers,C=NL</param-value> 
     14        </init-param--> 
     15    </filter> 
     16    <filter-mapping> 
     17        <filter-name>KlicClientCertificateFilter</filter-name> 
     18        <servlet-name>wsservlet</servlet-name> 
     19        <dispatcher>REQUEST</dispatcher> 
     20    </filter-mapping> 
    421    <listener> 
    522        <listener-class>com.sun.xml.ws.transport.http.servlet.WSServletContextListener</listener-class> 
     
    1330    </servlet> 
    1431    <servlet> 
    15         <servlet-name>KlicSSLContextBuilderInitializerServlet</servlet-name> 
    16         <servlet-class>nl.openwion.klic.security.KlicSSLContextBuilderInitializerServlet</servlet-class> 
     32        <servlet-name>KlicSecurityInitializerServlet</servlet-name> 
     33        <servlet-class>nl.openwion.klic.security.KlicSecurityInitializerServlet</servlet-class> 
    1734        <load-on-startup>2</load-on-startup> 
    1835        <init-param> 
    19             <!-- Keystore welke CA certificaten voor PKIoverheid bevat --> 
     36            <!-- Resource pad naar keystore welke CA certificaten voor PKIoverheid bevat --> 
    2037            <param-name>keyStore</param-name> 
    2138            <param-value>/WEB-INF/security/pkioverheid-cacerts</param-value> 
    22         </init-param> 
     39            </init-param> 
    2340        <init-param> 
    2441            <!-- Er zitten geen private keys in de keystore, dus passphrase 
     
    3047             Met onderstaande parameter kan worden gecontroleerd of het 
    3148             servercertificaat wel aan de verwachte organisatie (Kadaster) 
    32              is uitgegeven. 
     49             is uitgegeven. Bv. indien in het Graafbericht een ander 
     50             AntwoordAdres wordt geinjecteerd welke wijst naar een server met 
     51             wel een PKIoverheid certificaat, maar die niet is uitgegeven voor 
     52             het Kadaster. 
    3353 
    3454             Alle strings uit de parameter moeten voorkomen in de DN van het 
     
    4464        --> 
    4565        <!--init-param> 
    46             <param-name>subjectDistinguishedNameChecks</param-name> 
     66            <param-name>serverSubjectDistinguishedNameChecks</param-name> 
    4767            <param-value>O=Dienst voor het kadaster en de openbare registers,C=NL</param-value> 
    4868        </init-param--> 
     
    7898            <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
    7999        </user-data-constraint> 
    80         <!--auth-constraint> 
    81               voeg toe in $CATALINA_BASE/conf/tomcat-users.xml: 
    82               <role rolename="valid_client_cert"/> 
    83               <user username="EMAILADDRESS=info@b3partners.nl, CN=Test Client, O=OpenWION Client, L=Utrecht, ST=Utrecht, C=NL" password="null" roles="valid_client_cert"/> 
    84               username is X509Certificate.getSubjectDN().getName() 
    85             <role-name>valid_client_cert</role-name> 
    86         </auth-constraint--> 
    87100    </security-constraint> 
    88     <login-config> 
    89         <auth-method>CLIENT-CERT</auth-method> 
    90         <realm-name>openwion-service</realm-name> 
    91     </login-config> 
    92101</web-app> 
Note: See TracChangeset for help on using the changeset viewer.