Class DFNPKIClient

java.lang.Object
de.dfncert.tools.DFNPKIClient

public class DFNPKIClient extends 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.
Author:
moennich
  • Field Details

  • Constructor Details

    • DFNPKIClient

      public DFNPKIClient(String CAName) throws 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:
      Exception - Fehlerweiterleitung
  • Method Details

    • 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 String getCAName()
      Liefert den Installationsnamen der aktuellen CA.
      Returns:
      Installationsname der CA
    • setCAName

      public void setCAName(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(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(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 X509Certificate getRACertificate()
      Liefert das geladene RA-Zertifikat.
      Returns:
      RA-Zertifikat
    • getRAChain

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

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

      public 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(KeyStore store, String alias, char[] password) throws 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:
      Exception - Fehlerweiterleitung
    • loadRAFromPKCS12

      public void loadRAFromPKCS12(String filename, char[] password) throws 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:
      Exception - Fehlerweiterleitung
    • loadRAFromPKCS12

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

      public void loadRAFromProvider(String providerType, String providerName, String entryName, char[] password) throws 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:
      Exception - Fehlerweiterleitung
    • loadRAFromSmartCard

      public void loadRAFromSmartCard(String pkcs11library, char[] password, String entryName) throws 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:
      Exception - Fehlerweiterleitung
    • loadRAFromSmartCard

      public void loadRAFromSmartCard(String pkcs11library, char[] password, String entryName, int slot) throws 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:
      Exception - Fehlerweiterleitung
    • listCertsWithKeyFromSmartCard

      public Vector<String> listCertsWithKeyFromSmartCard(String pkcs11library, char[] password) throws 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:
      Exception - Fehlerweiterleitung