package at.gv.egovernment.moa.spss.server.tools; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.PrintStream; import java.security.cert.CertificateException; import iaik.asn1.structures.Name; import iaik.pki.store.certstore.CertStoreException; import iaik.pki.store.certstore.CertStoreTypes; import iaik.pki.store.certstore.directory.DirectoryCertStore; import iaik.pki.store.certstore.directory.DirectoryCertStoreParameters; import iaik.pki.store.certstore.directory.DirectoryStoreException; import iaik.security.ecc.provider.ECCProvider; import iaik.security.provider.IAIK; import iaik.utils.RFC2253NameParserException; import iaik.x509.X509Certificate; /** * A tool to support X509 certificate handling for configuring the MOA SP/SS * service. * * This class provides functions for: * * * @author Patrick Peck * @version $Id$ */ public class CertTool { /** Error message if the DN cannot be parsed according to RFC2253. */ private static final String ILLEGAL_RFC2253_NAME = "Kein gültiger RFC2253-Name"; /** * Main entry point of the tool. * * @param args The command line arguments. A single argument is expected, * which is the file name of the X509 certificate to inspect. */ public static void main(String args[]) { CertTool certTool = new CertTool(); if (args.length == 2 && "-info".equals(args[0])) { initProviders(); certTool.printCertInfo(args[1], System.out); } else if (args.length == 3 && "-add".equals(args[0])) { initProviders(); certTool.addCertToCertStore(args[1], args[2]); } else { certTool.printUsage(System.err); } } /** * Init the JCE providers, depending on the JDK used. * * Adds the IAIK JCE and IAIK ECC providers. */ private static void initProviders() { if (System.getProperty("java.version").startsWith("1.3")) { IAIK.addAsProvider(); } else { IAIK.addAsJDK14Provider(); } ECCProvider.addAsProvider(); } /** * Print the information about the certificate. * * This method will output information about the Subject DN, the Issuer DN and * the serial number of the certificate. * * @param certFile The name of the certificate file to inspect. * @param out The stream to print the information to. */ public void printCertInfo(String certFile, PrintStream out) { try { InputStream is = new BufferedInputStream(new FileInputStream(certFile)); X509Certificate cert = new X509Certificate(is); String issuerDN; String serial; String subjectDN; try { subjectDN = ((Name) (cert.getSubjectDN())).getRFC2253String(); } catch (RFC2253NameParserException e) { subjectDN = ILLEGAL_RFC2253_NAME; } try { issuerDN = ((Name) (cert.getIssuerDN())).getRFC2253String(); } catch (RFC2253NameParserException e) { issuerDN = ILLEGAL_RFC2253_NAME; } serial = cert.getSerialNumber().toString(); out.println("SubjectDN (RFC2253): " + subjectDN); out.println("IssuerDN (RFC2253) : " + issuerDN); out.println("Serial Number : " + serial); } catch (FileNotFoundException e) { System.err.println("Zertifikat nicht gefunden: " + certFile); } catch (IOException e) { System.err.println( "I/O Fehler beim Lesen des Zertifikats: " + e.getMessage()); } catch (CertificateException e) { System.err.println( "Fehler beim Lesen des Zertifikats: " + e.getMessage()); } catch (Throwable t) { System.err.println("Allgemeiner Fehler: " + t.getMessage()); } } /** * Add a certificate to a directory certificate store. * * @param certFile The certificate to add. * @param certStoreRoot The root directory of the certificate store. */ public void addCertToCertStore(String certFile, String certStoreRoot) { try { // read the certificate InputStream is = new BufferedInputStream(new FileInputStream(certFile)); X509Certificate cert = new X509Certificate(is); // initialize the DirectoryCertStore DirectoryCertStore certStore = new DirectoryCertStore( new SimpleDirectoryCertStoreParameters(certStoreRoot), null); certStore.storeCertificate(cert, null); System.out.println("\nDas Zertifikat wurde erfolreich hinzugefügt.\n"); } catch (FileNotFoundException e) { System.err.println("Zertifikat nicht gefunden: " + certFile); } catch (IOException e) { System.err.println( "I/O Fehler beim Lesen des Zertifikats: " + e.getMessage()); } catch (CertificateException e) { System.err.println( "Fehler beim Lesen des Zertifikats: " + e.getMessage()); } catch (DirectoryStoreException e) { System.err.println( "Fehler beim Öffnen des Zertifikatsspeichers: " + e.getMessage()); } catch (CertStoreException e) { System.err.println( "Fehler beim Hinzufügen des Zertifikats: " + e.getMessage()); } catch (Throwable t) { System.err.println("Allgemeiner Fehler: " + t.getMessage()); t.printStackTrace(); } } /** * Print tool usage. * * @param out The PrintStream to print to. */ private void printUsage(PrintStream out) { out.println("\nCerttool-Syntax:\n"); out.println("-info "); out.println("\n"); } } /** * Simple implementation of the DirectoryCertStoreParameters * interface intelligent enough for setting up a simple * DirectoryCertStore in the CertTool. * * @author Patrick Peck * @version $Id$ */ class SimpleDirectoryCertStoreParameters implements DirectoryCertStoreParameters { /** The cert store root directory. */ private String rootDirectory; /** * Create a new SimpleDirectoryCertStoreParameters object. * * @param rootDirectory The root directory of the cert store. */ public SimpleDirectoryCertStoreParameters(String rootDirectory) { this.rootDirectory = rootDirectory; } /** * @return "MOA Directory CertStore" * @see iaik.pki.store.certstore.CertStoreParameters#getId() */ public String getId() { return "MOA Directory CertStore"; } /** * @return CertStoreTypes.DIRECTORY * @see iaik.pki.store.certstore.CertStoreParameters#getType() */ public String getType() { return CertStoreTypes.DIRECTORY; } /** * @return false * @see iaik.pki.store.certstore.CertStoreParameters#isReadOnly() */ public boolean isReadOnly() { return false; } /** * @return false * @see iaik.pki.store.certstore.directory.DirectoryCertStoreParameters#createNew() */ public boolean createNew() { return false; } /** * @return The root directory given at construction time. * @see iaik.pki.store.certstore.directory.DirectoryCertStoreParameters#getRootDirectory() */ public String getRootDirectory() { return rootDirectory; } }