Class DFNPKIClient


  • public class DFNPKIClient
    extends java.lang.Object
    SOAP-Client für die DFN-PKI. Normalerweise ist jeder ausgelagerte CA in der DFN-PKI so konfiguriert, dass eine Instanz dieser Klasse mit der CA kommunizieren kann. Dazu muss der Installationsname der CA bekannt sein. Dieser Name kann aus der URL der Webschnittstellen entnommen werden:
    https://pki.pca.dfn.de/<Installationsname>/pub
    Es existieren für die verschiedenen Schnittstellen (öffentlich, RA) eigene Objekte. Für die öffentliche Schnittstelle ist kein RA-Zertifikat erforderlich. Die Methoden der Registrierungsschnittstelle können erst nach dem erfolgreichen Laden eines RA-Zertifikats mittels der "loadRA" Methoden aufgerufen werden. Hier ein komplettes Beispiel für die Erzeugung eines Antrags mit Schlüsselpaar, Hochladen und Genehmigung des Antrags sowie der Abholung des resultierenden Zertifikats:
     // RSA-Schlüsselpaar erzeugen
     KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
     generator.initialize(2048);
     KeyPair pair = generator.generateKeyPair();
    
     // PKCS#10-Antrag erzeugen
     String request = Cryptography.createPKCS10(
         "C=DE,O=Testinstallation Eins CA,OU=PCA,CN=Max Mustermann",
         pair.getPublic(),
         pair.getPrivate());
    
     // CLient erzeugen und Antrag hochladen
     DFNPKIClient client = new DFNPKIClient("test-eins-ca");
     int serial = client.getPublic().newRequest(
         1,
         request,
         new String[]{"email:mustermann@example.org"},
         "User",
         Cryptography.sha1("Sperr-PIN".getBytes()),
         "Max Mustermann",
         "mustermann@example.org",
         null,
         true);
     
     // Sperrprüfung einschalten
     client.setCheckRevocation(true);
    
     // RA-Zertifikat laden
     client.loadRAFromPKCS12("test-eins-ra1.p12", "test-eins".toCharArray());
    
     // Antragsdaten holen, diese signieren und damit Antrag genehmigen
     byte raw[] = client.getRegistration().getRawRequest(serial);
     client.getRegistration().approveRequest(
         serial,
         raw,
         Cryptography.createPKCS7Signed(raw,
         client.getRAPrivateKey(),
         client.getRACertificate()));
    
     // Alle 10 Sekunden nach ausgestelltem Zertifikat fragen
     String pem = "";
     while (pem.equals("")) {
         Thread.sleep(10000l);
         pem = client.getRegistration().getCertificateByRequestSerial(serial);
     }
     
    Technischer Support sowie eine Testumgebung kann bei der DFN-PCA unter dfnpca@dfn-cert.de angefragt werden.
    • Field Summary

      Fields 
      Modifier and Type Field Description
      static java.lang.String PKCS11_PROVIDER_NAME  
    • Constructor Summary

      Constructors 
      Constructor Description
      DFNPKIClient​(java.lang.String CAName)
      Erstellt eine neue Instanz für die Kommunikation mit der CA.
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      java.lang.String getCAName()
      Liefert den Installationsnamen der aktuellen CA.
      DFNCERTDomains getDomains()
      Reserviert für die Zukunft.
      DFNCERTPublic getPublic()
      Liefert die Schnittstelle mit Methoden für öffentliche Funktionen wie z.B.
      java.security.cert.X509Certificate getRACertificate()
      Liefert das geladene RA-Zertifikat.
      java.security.cert.X509Certificate[] getRAChain()
      Liefert die komplette Kette des RA-Zertifikats inklusive aller CA-Zertifikate.
      java.security.PrivateKey getRAPrivateKey()
      Liefert den privaten Schlüssel des RA-Zertifikats.
      DFNCERTRegistration getRegistration()
      Liefert die Schnittstelle mit Methoden für die Registrierungsstelle wie z.B.
      javax.net.ssl.SSLSocketFactory getSocketFactory()
      Liefert die Socket-Fabrik für die aktuelle CA.
      java.util.Vector<java.lang.String> listCertsWithKeyFromSmartCard​(java.lang.String pkcs11library, char[] password)
      Listet alle Objekte auf einem PKCS#11-Gerät auf, denen ein privater Schlüssel zugeordnet werden kann.
      void loadRAFromKeystore​(java.security.KeyStore store, java.lang.String alias, char[] password)
      Läd das RA-Operator Zertifikat aus einem bereits initialisierten KeyStore.
      void loadRAFromPKCS12​(java.io.InputStream input, char[] password)
      Läd das RA-Operator Zertifikat als PKCS#12 aus einem InputStream.
      void loadRAFromPKCS12​(java.lang.String filename, char[] password)
      Läd das RA-Operator Zertifikat aus einer PKCS#12-Datei.
      void loadRAFromProvider​(java.lang.String providerType, java.lang.String providerName, java.lang.String entryName, char[] password)
      Läd das RA-Operator Zertifikat aus einem Provider der eigenen Wahl.
      void loadRAFromSmartCard​(java.lang.String pkcs11library, char[] password, java.lang.String entryName)
      Läd ein RA-Operator Zertifikat von einem PKCS#11-Gerät.
      void loadRAFromSmartCard​(java.lang.String pkcs11library, char[] password, java.lang.String entryName, int slot)
      Läd ein RA-Operator Zertifikat von einem PKCS#11-Gerät wie z.B. einer SmartCard oder einem USB-Token.
      void setCAName​(java.lang.String CAName)
      Setzt den Installationsnamen der aktuellen CA.
      void setCheckRevocation​(boolean bCheckRevocation)
      Schaltet die Prüfung des Revozierungsstatus der Zertifikate beim Aufbau einer SSL-Verbindung an oder aus.
      void setPublicHostname​(java.lang.String Hostname)
      Setzt den Rechnernamen für die öffentliche Schnittstelle.
      void setRAHostname​(java.lang.String Hostname)
      Setzt den Rechnernamen für die Registrierungs-Schnittstelle.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • PKCS11_PROVIDER_NAME

        public static final java.lang.String PKCS11_PROVIDER_NAME
        See Also:
        Constant Field Values
    • Constructor Detail

      • DFNPKIClient

        public DFNPKIClient​(java.lang.String CAName)
                     throws java.lang.Exception
        Erstellt eine neue Instanz für die Kommunikation mit der CA. Der angegebene Name muss der Installationsname der CA und keine komplette URL sein! Den Namen der CA im Zweifelsfall bitte bei der DFN-PCA erfragen.
        Parameters:
        CAName - Installationsname der CA
        Throws:
        java.lang.Exception - Fehlerweiterleitung
    • Method Detail

      • getPublic

        public DFNCERTPublic getPublic()
        Liefert die Schnittstelle mit Methoden für öffentliche Funktionen wie z.B. Beantragung eines Zertifikats. Es muss vorher kein Zertifikat zur Authentifizierung geladen werden.
        Returns:
        Öffentliche Schnittstelle
      • getDomains

        public DFNCERTDomains getDomains()
        Reserviert für die Zukunft. Noch nicht benutzen!
        Returns:
        Schnittstelle
      • getRegistration

        public DFNCERTRegistration getRegistration()
        Liefert die Schnittstelle mit Methoden für die Registrierungsstelle wie z.B. Genehmigen von Zertifikatanträgen. Es muss zuvor über eine der "loadRA"-Methoden ein RA-Zertifikat für die Authentifizierung geladen werden.
        Returns:
        Registrieungsstellen-Schnittstelle
      • getCAName

        public java.lang.String getCAName()
        Liefert den Installationsnamen der aktuellen CA.
        Returns:
        Installationsname der CA
      • setCAName

        public void setCAName​(java.lang.String CAName)
        Setzt den Installationsnamen der aktuellen CA. Der Name kann bei der DFN-PCA erfragt werden.
        Parameters:
        CAName - Installationsname der CA
      • setPublicHostname

        public void setPublicHostname​(java.lang.String Hostname)
        Setzt den Rechnernamen für die öffentliche Schnittstelle. Diese Methode muss normalerweise nie verwendet werden, da der interne Standardwert pki.pca.dfn.de ist.
        Parameters:
        Hostname - Rechnername für öffentliche Schnittstelle
      • setRAHostname

        public void setRAHostname​(java.lang.String Hostname)
        Setzt den Rechnernamen für die Registrierungs-Schnittstelle. Diese Methode muss normalerweise nie verwendet werden, da der interne Standardwert ra.pca.dfn.de ist.
        Parameters:
        Hostname - Rechnername für Registrierungs-Schnittstelle
      • setCheckRevocation

        public void setCheckRevocation​(boolean bCheckRevocation)
        Schaltet die Prüfung des Revozierungsstatus der Zertifikate beim Aufbau einer SSL-Verbindung an oder aus. Der DFNPKIClient setzt keinen Default-Wert
        Parameters:
        bCheckRevocation - true: Property com.sun.net.ssl.checkRevocation auf true setzen.
      • getRACertificate

        public java.security.cert.X509Certificate getRACertificate()
        Liefert das geladene RA-Zertifikat.
        Returns:
        RA-Zertifikat
      • getRAChain

        public java.security.cert.X509Certificate[] getRAChain()
        Liefert die komplette Kette des RA-Zertifikats inklusive aller CA-Zertifikate.
        Returns:
        RA-Kette
      • getRAPrivateKey

        public java.security.PrivateKey getRAPrivateKey()
        Liefert den privaten Schlüssel des RA-Zertifikats.
        Returns:
        Privater Schlüssel RA-Zertifikat
      • getSocketFactory

        public javax.net.ssl.SSLSocketFactory getSocketFactory()
        Liefert die Socket-Fabrik für die aktuelle CA. Da hier bereits das RA-Zertifikat "freigeschaltet" ist, kann diese Klasse für Authentifizierung an anderer Stelle eingesetzt werden (z.B. JDBC).
        Returns:
        Socket-Fabrik
      • loadRAFromKeystore

        public void loadRAFromKeystore​(java.security.KeyStore store,
                                       java.lang.String alias,
                                       char[] password)
                                throws java.lang.Exception
        Läd das RA-Operator Zertifikat aus einem bereits initialisierten KeyStore. Dieser KeyStore muss die Methoden getKey, getCertificate und getCertificateChain für das RA-Zertifikat bereitstellen.
        Parameters:
        store - Initialisierter KeyStore
        alias - Alias-Name des RA-Zertifikats im KeyStore
        password - Passwort des KeyStores (für getKey)
        Throws:
        java.lang.Exception - Fehlerweiterleitung
      • loadRAFromPKCS12

        public void loadRAFromPKCS12​(java.lang.String filename,
                                     char[] password)
                              throws java.lang.Exception
        Läd das RA-Operator Zertifikat aus einer PKCS#12-Datei. Dazu wird die Datei mit dem angegebenen Passwort geöffnet und es werden alle Alias Einträge durchlaufen. Der erste Alias-Eintrag, zu dem ein privater Schlüssel existiert, wird als RA-Operator Zertifikat verwendet.
        Parameters:
        filename - Dateiname der Datei
        password - Passwort der Datei
        Throws:
        java.lang.Exception - Fehlerweiterleitung
      • loadRAFromPKCS12

        public void loadRAFromPKCS12​(java.io.InputStream input,
                                     char[] password)
                              throws java.lang.Exception
        Läd das RA-Operator Zertifikat als PKCS#12 aus einem InputStream.
        Parameters:
        input - PKCS12 Eingabestrom
        password - Passwort des PKCS12
        Throws:
        java.lang.Exception - Fehlerweiterleitung
      • loadRAFromProvider

        public void loadRAFromProvider​(java.lang.String providerType,
                                       java.lang.String providerName,
                                       java.lang.String entryName,
                                       char[] password)
                                throws java.lang.Exception
        Läd das RA-Operator Zertifikat aus einem Provider der eigenen Wahl.
        Parameters:
        providerType - Typ des Providers (für KeyStore.getInstance)
        providerName - Name des Providers (registriert über Security.addProvider)
        entryName - Alias des Zertifikats im KeyStore
        password - Passwort zum Öffnen des KeyStore (KeyStore.load)
        Throws:
        java.lang.Exception - Fehlerweiterleitung
      • loadRAFromSmartCard

        public void loadRAFromSmartCard​(java.lang.String pkcs11library,
                                        char[] password,
                                        java.lang.String entryName)
                                 throws java.lang.Exception
        Läd ein RA-Operator Zertifikat von einem PKCS#11-Gerät. Wie loadRAFromSmartCard(java.lang.String, char[], java.lang.String, int) nur dass hier -1 für slot übergeben wird, d.h. es wird das Kryptogerät im ersten gefundenen Slot, der ein Gerät enthält, verwendet.
        Parameters:
        pkcs11library - Pfad zu der PKCS11-Bibliothek
        password - Passwort (User-PIN) des Geräts
        entryName - Alias des Zertifikats im KeyStore
        Throws:
        java.lang.Exception - Fehlerweiterleitung
      • loadRAFromSmartCard

        public void loadRAFromSmartCard​(java.lang.String pkcs11library,
                                        char[] password,
                                        java.lang.String entryName,
                                        int slot)
                                 throws java.lang.Exception
        Läd ein RA-Operator Zertifikat von einem PKCS#11-Gerät wie z.B. einer SmartCard oder einem USB-Token. Das Kryptogerät muss zum Zeitpunkt des Aufrufs dieser Methode eingesteckt sein. Warten auf das Einstecken eines Kryptogeräts ist nicht implementiert.
        Parameters:
        pkcs11library - Pfad zu der PKCS11-Bibliothek
        password - Passwort (User-PIN) des Geräts
        entryName - Alias auf dem Gerät (z.B. mit listCertsWithKeyFromSmartCard(java.lang.String, char[]) ermittelt)
        slot - Slot des Readers, -1 für den ersten verfügbaren
        Throws:
        java.lang.Exception - Fehlerweiterleitung
      • listCertsWithKeyFromSmartCard

        public java.util.Vector<java.lang.String> listCertsWithKeyFromSmartCard​(java.lang.String pkcs11library,
                                                                                char[] password)
                                                                         throws java.lang.Exception
        Listet alle Objekte auf einem PKCS#11-Gerät auf, denen ein privater Schlüssel zugeordnet werden kann.
        Parameters:
        pkcs11library - Pfad zur PKCS#11-Bibliothek
        password - Passwort des Geräts
        Returns:
        Liste aller Alias-Namen, die einen Schlüssel haben
        Throws:
        java.lang.Exception - Fehlerweiterleitung