GLOBALTRUST QUALIFIED TIMESTAMP – qualifizierte Zeitstempel gemäß eIDAS-VO für revisionssicheres Dokumentenmanagement

21. November 2022
GLOBALTRUST QUALIFIED TIMESTAMP qualifizierter Zeitstempeldienst gemäß eIDAS-VO

GLOBALTRUST QUALIFIED TIMESTAMP vergibt zu beliebigen Dokumenten einen Zeitstempel und garantiert dadurch die Existenz dieses Dokuments zu diesem Zeitpunkt. Das Dokument selbst wird nicht übertragen, Datenschutz bleibt gewahrt – international anerkannter Standard RFC 3161 und EU-weite Rechtsgrundlage garantieren Interoperabilität. GLOBALTRUST archiviert ausgestellte Zeitstempel ohne Zusatzkosten.

Warum GLOBALTRUST QUALIFIED TIMESTAMP?

In vielen Fällen ist es wichtig zu wissen, wann ein Dokument erstellt wurde, wann es abgegeben wurde oder wann es veröffentlicht wurde – oder abstrakter: wann ein elektronischer Vorgang stattgefunden hat. Denken Sie nur an den Finanzmarkt, der ohne unfälschbare und Millisekunden-genaue Zeitangaben überhaupt nicht mehr funktionieren würde.

Die lokale Computerzeit ist einerseits viel zu ungenau, und kann andererseits auch nach Belieben manipuliert werden. Das Internet kennt keine zuverlässigen Zeitangaben, daher sind spezielle Dienste erforderlich. Einer Zeitbestätigung von vertrauenswürdiger dritter Stelle kommt daher hohe Beweis- und Bestätigungskraft zu.

Der qualifizierte Zeitstempel verbindet ein elektronisches Dokument mit der “offiziellen Zeit”. Damit ist die Existenz des Dokuments zu diesem Zeitpunkt garantiert. Darüber hinaus wird belegt, dass das Dokument seit diesem Zeitpunkt nicht mehr verändert wurde (Integrität).

Elektronische Zeitstempeldienste gewinnen an Bedeutung. Sie dienen der Beweissicherung, die auch langfristig regulatorischen Anforderungen standhält: Sei es zur revisionssicheren Archivierung, dem Nachweis der Priorität geistigen Eigentums, zur Betrugsverhinderung, zur Dokumentation von Abgabe- und Eingangsterminen oder im elektronischen Vergabeverfahren. Unsere Kunden verwenden sie im Rahmen des automatisierten Dokumentenmanagements noch für zahlreiche weitere Funktionen.

Gerade im Zusammenhang mit der Veröffentlichung einer Information, dem Vorhandensein einer bestimmten Website, in Fragen des UWG, von Urheberrechtsverletzungen, in e-Vergabe-Themen oder in Fragen der Nutzung von Namen und Begriffen, kommt eine zuverlässige Zeitangabe höchste Bedeutung zu.  Weitere häufige Anwendungsszenarien sind Zeitstempel, die in elektronische Signaturen auf Verträgen eingebettet werden, Protokolle im e-Health-Bereich sowie Non Disclosure Agreements (NDAs).

Als Vertrauensdiensteanbieter gemäß eIDAS und SVG wird der Zeitstempeldienst GLOBALTRUST QUALIFIED TIMESTAMP unter Aufsicht der Telekom-Control-Kommission/RTR GmbH erbracht. GLOBALTRUST hat 2018 als erster Anbieter Österreichs die Entwicklung maßgeblich mitgestaltet.

Was kann ein Zeitstempel nicht?

Ein Timestamp beweist als “Zeitsignatur” den exakten Zeitpunkt, zu dem ein Dokument vorgelegen hat. Eine unversehrte Zeitsignatur ist weiters der Beleg, dass das Dokument nach dem Anbringen nicht verändert worden ist (Integrität).

Er trifft aber keinerlei Aussage darüber, woher bzw. von wem ein Dokument stammt (Authentizität) und drückt auch nicht die Zustimmung zum Dokumenteninhalt aus (“Content Commitment”). Diese Funktionen können nur mithilfe (qualifizierter) elektronischer Signaturen und Siegel abgedeckt werden. Hier haben wir eine kurze Übersicht erstellt.

International anerkannter Standard

GLOBALTRUST verwendet den international anerkannten und weit verbreiteten Standard RFC 3161 (Internet X.509 Public Key Infrastructure Timestamp Protocol, TSP). Auf diese Weise ist globale Interoperabilität gesichert, unabhängig vom verwendeten Dateiformat oder Dokumentenmanagement-System.

Wie funktioniert der qualifizierte Zeitstempel?

Aus einem Dokument wird automatisiert ein eindeutiger, nicht fälschbarer Hash-Code erzeugt. Dieser Hash-Code ist eindeutig einem bestimmten Dokument zugeordnet. Aus dem Hash-Code kann jedoch nicht auf den Inhalt des Dokuments geschlossen werden. Als hashbares und daher zeitstempelfähiges “Dokument” können beliebige (elektronische) Daten dienen. Beliebt sind etwa XML-, PDF- und JSON-Dokumente.

Dieser Hash-Code wird zum GLOBALTRUST TIMESTAMP-Server verschlüsselt übermittelt (TIMESTAMP-Request), dort mit der genauen Zeit versehen und durch den TIMESTAMP-Server elektronisch signiert.

GLOBALTRUST QUALIFIED TIMESTAMP bezieht die genaue Uhrzeit direkt von der Frankfurter Atomuhr und garantiert eine Genauigkeit von einer Sekunde (interne Analysen erbrachten eine Genauigkeit von besser als 10 Millisekunden). Der Zeitstempel wird entweder als eigene Datei dem Anforderer übermittelt, der diese Datei gemeinsam mit dem Originaldokument aufbewahrt. Zahlreiche Systeme haben jedoch auch Zeitstempelfunktionen integriert und betten z. B. den Zeitstempel in ein signiertes oder nicht-signiertes PDF ein. Zusätzlich wird der Zeitstempel bei GLOBALTRUST 35 Jahre für spätere Beweissicherungsfragen aufbewahrt.

Diese Vorgangsweise garantiert die 100%ige Vertraulichkeit Ihrer wertvollen Dokumente. Der Inhalt der vertraulichen Dokumente wird zu keinem Zeitpunkt an GLOBALTRUST übermittelt. Da auch die Übertragung des Hashcodes verschlüsselt erfolgt, ist es Angreifern nicht möglich zu erkennen, wer überhaupt Requests anfordert.

GLOBALTRUST archiviert ausgestellte Zeitstempel

Zusätzlich wird jeder Zeitstempel (nicht das Dokument!) zu Beweissicherungszwecken archiviert und kann zu einem späteren Zeitpunkt zur Verfügung gestellt werden. Selbst wenn der Kunde seinen Zeitstempel verliert, genügt die Vorlage des Hash-Wertes eines Dokuments, um die Gültigkeit zu einem bestimmten Zeitpunkt prüfen zu können. GLOBALTRUST archiviert alle vergebenen Zeitstempel bis zu 35 Jahre.

Konditionen

Zeitstempel können in unterschiedlichen Jahreskontigenten angefordert werden. Mindestmenge sind 100 Zeitstempel, die innerhalb eines Jahres zu verbrauchen sind. Ein Wechsel zur nächsthöheren Kontingentgröße ist jederzeit möglich und vom Benutzer bekannt zu geben.

  • 100 Zeitstempel/Jahr: 20,- Euro
  • 1.000 Zeitstempel/Jahr: 185,-

Konditionen für besondere Kontingente, höhere Staffeln oder für Wiederverkäufer auf Anfrage. Benutzer eines GLOBALTRUST-Zertifikates erhalten ein Basiskontingent gratis.

Benutzer erhalten ein Erinnerungsmail über den aktuellen Verbrauch und Informationen zur Bestellung, wenn Ihr Kontingent zu Ende geht. Somit ist sichergestellt, dass der Dienst immer verfügbar ist.

Genauigkeit von GLOBALTRUST QUALIFIED TIMESTAMP

GLOBALTRUST QUALIFIED TIMESTAMP garantiert eine Zeitgenauigkeit von +/- einer Sekunde. Die Zeit bezieht sich auf UTC (Universal Time Zone). Sollte die Zeitgarantie nicht mehr gewährleistet sein, wird das Timestamp-Service vorübergehend deaktiviert und der Antragsteller erhält einen entsprechenden Warnhinweis.

Interne Tests ergaben, dass die Genauigkeit 100-mal höher ist und die Abweichungen im Normalfall kleiner als 10 Millisekunden sind.

Wer kann GLOBALTRUST QUALIFIED TIMESTAMP nutzen?

Für die Nutzung ist eine Bestellung bei GLOBALTRUST erforderlich. Inhaber bestimmter gültiger GLOBALTRUST Zertifikate haben Anspruch auf bis zu 100 kostenlose Zeitstempel.

Was benötigt man zur Nutzung?

Adobe Acrobat erlaubt beim Signieren eines PDF Dokuments zusätzlich einen Zeitstempel einzubinden, der Abruf erfolgt automatisiert. Es wird keine zusätzliche Software benötigt. Installation siehe https://www.globaltrust.eu/static/support-adobe-acrobat-dc-wi….

Zahlreiche Provider von ECM-, DMS-, und ERP-Systemen haben GLOBALTRUST QUALIFIED TIMESTMAP bereits in Ihre Produkte integriert.  Erkundigen Sie sich bei unseren Partnern nach der passenden Lösung.

Automatisierte Zeitstempeldienste und Massenzeitstempel

Selbstverständlich ist auch die automatisierte Vergabe von Zeitstempeln oder das Versehen großer Mengen von Dokumenten mit Zeitstempeln möglich. Dazu sind spezielle Archivprogramme erforderlich. GLOBALTRUST stellt interessierten Entwicklern auf Anforderung die notwendigen Spezifikationen zur Integration der Zeitstempelfunktionen in ihre Produkte zur Verfügung.

Welche Hash-Algorithmen werden unterstützt?

GLOBALTRUST QUALIFIED TIMESTAMP unterstützt die als sicher geltenden Algorithmen SHA-256, SHA-512 und RIPEMD-160.

Welche Nutzungsvarianten werden unterstützt?

TIMESTAMP mittels TCP/IP-Port ausstellen: timestamp.globaltrust.eu Port 10318

  • Timestampvergabe gemäß Timestamp Protocol (TSP) nach RFC 3161(+ Update RFC 5816)
  • Nutzung: TLS-Client-Authentifizierung mit Zertifikat notwendig (Zertifikat muss von GLOBALTRUST ausgestellt sein)
  • Timestamp enthält komplette Zertifikatskette mit Timestamp-Zertifikat, Zwischenzertifikat und Root-Zertifikat
  • TLS-Verschlüsselung

TIMESTAMP mittels HTTPS ausstellen (Port 443 + 11080)

  • Geeignet für Adobe Acrobat ab Version 10 und Reader DC
  • https://timestamp.globaltrust.eu
  • https://timestamp.globaltrust.eu:11080
  • Nutzung: zwei alternative Varianten (A, B) möglich
  • Variante A: Authentifizierung mit Username/Passwort (werden von GLOBALTRUST vergeben)
  • Variante B: TLS-Client-Authentifizierung mit Zertifikat (Zertifikat muss von GLOBALTRUST ausgestellt sein)
  • Timestamp enthält nur Timestamp-Zertifikat

Die Schritt-für-Schritt-Anleitung zur Nutzung von GLOBALTRUST QUALIFIED TIMESTAMP für Adobe Acrobat DC findet sich unter https://www.globaltrust.eu/static/support-adobe-acrobat-dc-wi….

TIMESTAMP mittels HTTPS ausstellen (Port 10080)

  • Nicht geeignet für Adobe Acrobat
  • https://timestamp.globaltrust.eu:10080
  • Nutzung: zwei alternative Varianten (A, B) möglich
  • Variante A: Authentifizierung mit Username/Passwort (werden von GLOBALTRUST vergeben)
  • Variante B: TLS-Client-Authentifizierung mit Zertifikat (Zertifikat muss von GLOBALTRUST ausgestellt sein)
  • Timestamp enthält komplette Zertifikatskette mit Timestamp-Zertifikat, Zwischenzertifikat und Root-Zertifikat

TIMESTAMP mittels HTTPS ausstellen (Port 13080)

Bei Adobe Acrobat ab Version 10 und Reader DC: https://timestamp.globaltrust.eu:13080

  • Nutzung: Authentifizierung mit Username/Passwort notwendig (werden von GLOBALTRUST vergeben)
  • Timestamp enthält komplette Zertifikatskette mit Timestamp-Zertifikat, Zwischenzertifikat und Root-Zertifikat
  • Produkt: u. a. Adobe Acrobat Version 10, Adobe Acrobat Reader DC

Entwicklerinformationen

 

TCP/IP-Zugriff auf GLOBALTRUST QUALIFIED TIMESTAMP Server

Grundlegender Ablauf

  1. Aus dem Dokument, das mit einem Zeitstempel versehen werden soll, wird ein Hash gebildet. Es werden die Hash Algorithmen SHA-1, SHA-256, SHA-512 und RIPEMD-160 unterstützt.
  2. Dieser Hash wird an den GLOBALTRUST QUALIFIED TIMESTAMP Server in Form eines in RFC3161 spezifizierten Timestamp Request geschickt.
  3. Der GLOBALTRUST QUALIFIED TIMESTAMP Server schickt den Zeitstempel in Form eines Timestamp Reply zurück.

Zugriff auf GLOBALTRUST QUALIFIED TIMESTAMP Server mit TCP/IP

Der GLOBALTRUST QUALIFIED TIMESTAMP Server implementiert das “Socket Based Protocol” (RFC 3161 3.3) mit dem Zusatz, dass TLS verschlüsselte Sockets verwendet werden. Zur Benutzerauthentifizierung muss dem Server beim TLS-Handshake ein Client Zertifikat vorgewiesen werden (es sind alle nicht abgelaufenen und nicht widerrufenen persönlichen GLOBALTRUST Zertifikate berechtigt, Zeitstempel abzuholen, es muss jedoch ein Zeitstempel-Kontingent vereinbart werden).

Der GLOBALTRUST QUALIFIED TIMESTAMP Server kann über den DNS Namen timestamp.globaltrust.eu, Port 10318 erreicht werden.

Grundsätzlich können Lösungen in beliebigen Programmierumgebungen verwendet werden, es muss folgende Unterstützung gegeben sein:

  • TLS-Unterstützung
    Verwendung von Clientzertifikaten beim TLS-Handshake muss unterstützt werden
  • Möglichkeit zur Erstellung und Interpretation eines “Socket Based Protocol”-Headers (RFC 3161 3.3)
  • Möglichkeit zur Erstellung eines Timestamp-Requests gemäß RFC 3161 (unterstützt wird SHA-1, SHA-256, SHA-512 und RIPEMD-160)
  • Möglichkeit zur Interpretation einer Timestamp-Response gemäß RFC 3161

Eine Java Client Applikation könnte in etwa so aussehen, wenn das File request.tsq ein gültiger Timestamp Request (TSQ) ist. Der TSQ selbst wurde mittels OpenSSL oder BouncyCastle-Bibliothek generiert.

Beachten Sie, dass der bereitgestellte Mustercode nur eine erste Orientierung darstellt und keine Gewähr für formale, inhaltliche oder syntaktische Richtigkeit übernommen wird. Der Code soll Java-Programmierern den Einstieg in die Timestamp-Problematik erleichtern.

Nutzer anderer Programmiersprachen (C, C++, usw.) benötigen gegebenenfalls RFC3161-konforme Erweiterungen bzw. Funktionsbibliotheken. Kontaktieren Sie diesbezüglich Ihren Lieferanten für Ihre Entwicklungsumgebung. GLOBALTRUST kann dazu keinen Support leisten.

package eu.globaltrust.test;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import org.bouncycastle.util.encoders.Base64;
public final class TSAHTTPClientWithHTTPAuth {
    private TSAHTTPClientWithHTTPAuth() {
    }
    public static void main(final String[] args) {
        // Truststore setzen; Truststore enthält GLOBALTRUST root
        // Zertifikat - notwendig, da der Client dem TLS Serverzertifikat
        // sonst nicht traut - siehe
        // http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/JSSERefGuide.html#CreateKeystore
        System.setProperty("javax.net.ssl.trustStore", "truststore-client");
        // Username und Passwort für HTTP Authentifikation setzen
        String username = "USERNAME";
        String password = "PASSWORT";
        try {
            // Laden des Timestamp request
            File fReq = new File("request.tsq");
            byte[] req = new byte[(int) fReq.length()];
            try {
                new FileInputStream(fReq).read(req);
            } catch (Exception e) {
                System.err.println("Error reading from file");
                return;
            }
            // öffnen der Netzwerkverbindung
            HttpsURLConnection conn = (HttpsURLConnection) new URL("https://timestamp.globaltrust.eu:10080")
                    .openConnection();
            // Setzen der HTTP Parameter
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/timestamp-query");
            conn.setRequestProperty("Content-Length", Integer.toString(req.length));
            // Erstellen der Authorization-Information lt. RFC 2617
            // Base64("Username:Password")
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            Base64.encode((username + ":" + password).getBytes(), bout);
            String base64Auth = bout.toString("8859_1");
            conn.setRequestProperty("Authorization", "Basic " + base64Auth);
            // Senden des Requests
            OutputStream os = conn.getOutputStream();
            os.write(req);
            conn.connect();
            os.close();
            System.out.println("Request sent.");
            // Empfangen der Response
            InputStream is = conn.getInputStream();
            byte[] resp = new byte[conn.getContentLength()];
            is.read(resp);
            is.close();
            FileOutputStream osResp = new FileOutputStream("tsatestresp.der");
            osResp.writpackage eu.globaltrust.test;
import org.bouncycastle.tsp.TimeStampResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.math.BigInteger;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
/**
 * This class contains a main method that connects to a timestamping server
 * using the TCP protocol specified in RFC3161 with an additional SSL layer. It
 * should only be used for reference purposes.
 * @author DW
 *
 */
public final class TSATCPClient {
    private TSATCPClient() {
    }
    public static void main(final String[] args) {
        // Client Zertifikat bei SSL Handshake "vorweisen"
        System.setProperty("javax.net.ssl.keyStore", "zertifikat.p12");
        System.setProperty("javax.net.ssl.keyStorePassword", "PASSWORT");
        System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
        // Truststore setzen; Truststore enthält GLOBALTRUST root
        // Zertifikat - notwendig, da der Client dem TLS Serverzertifikat
        // sonst nicht traut - siehe
        // http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/JSSERefGuide.html#CreateKeystore
        System.setProperty("javax.net.ssl.trustStore", "truststore-client");
        try {
            // Timestamp Request einlesen
            File fReq = new File("request.tsq");
            FileInputStream fis = new FileInputStream(fReq);
            byte[] request = new byte[(int) fReq.length()];
            fis.read(request);
            fis.close();
            // Header für direct TCP-based TSA message vorbereiten
            // length-Header Feld
            int len = request.length + 1;
            byte[] blength = new BigInteger(Integer.toString(len)).toByteArray();
            byte[] length = new byte[4];
            // Falls Länge weniger bytes verbraucht, als vorgesehen ist,
            // wird der Rest mit 0-Bytes aufgefüllt.
            for (int i = 3; i > 3 - blength.length; i--) {
                length[i] = blength[(blength.length - 1) + (i - 3)];
            }
            for (int i = 0; i < 4 - blength.length; i++) {
                length[i] = 0;
            }
            // Verbindung aufbauen
            SSLSocket s = (SSLSocket) SSLSocketFactory.getDefault().createSocket("timestamp.globaltrust.eu", 10318);
            // length-Header Feld schicken
            s.getOutputStream().write(length);
            // flag-Header Feld vorbereiten und schicken
            byte[] flag = new byte[1];
            flag[0] = 0;
            s.getOutputStream().write(flag);
            // timestamp request schicken
            s.getOutputStream().write(request);
            // Antwort lesen
            InputStream is = s.getInputStream();
            // Length-Header Feld lesen
            blength = new byte[4];
            int readlen;
            if ((readlen = is.read(blength, 0, 4)) < 4) {
                System.out.println("Couldn't read length");
                System.out.println("only read " + readlen + " bytes");
                return;
            }
            int ilength = new BigInteger(blength).intValue();
            // Flag-Header Feld lesen
            flag = new byte[1];
            if (is.read(flag, 0, 1) != 1) {
                System.out.println("flag not read");
            }
            // Timestamp Response lesen
            byte[] value = new byte[ilength - 1];
            if ((readlen = is.read(value, 0, ilength - 1)) != ilength - 1) {
                System.out.println("could not read message");
                System.out.println("only read " + readlen + " bytes");
                return;
            }
            // Timestamp Response abspeichern
            FileOutputStream reply = new FileOutputStream("reply.tsr");
            reply.write(value);
            reply.close();
            // Timestamp Response interpretieren
            TimeStampResponse resp = new TimeStampResponse(value);
            System.out.println("Response Status: " + resp.getStatus());
            System.out.println("Timestamp at: " + resp.getTimeStampToken().getTimeStampInfo().getGenTime());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

HTTPS-Zugriff auf GLOBALTRUST QUALIFIED TIMESTAMP Server

 

Der GLOBALTRUST QUALIFIED TIMESTAMP Server implementiert das “Timestamp Protocol via HTTP” (RFC 3161 3.4) mit dem Zusatz, dass SSL verschlüsselte Sockets verwendet werden. Die Benutzerauthentifizierung kann auf zwei Arten erfolgen:

  • Dem Server wird beim TLS-Handshake ein Client Zertifikat vorgewiesen (im Moment sind alle nicht abgelaufenen und nicht widerrufenen persönlichen GLOBALTRUST Zertifikate berechtigt, Zeitstempel abzuholen).
  • Dem Server werden mittels HTTP Basic Authentication Scheme (RFC 2617 2.) Username und Passwort übermittelt.

Der GLOBALTRUST QUALIFIED TIMESTAMP Server kann über die URL https://timestamp.globaltrust.eu:10080

Für Adobe Acrobat (und nur dafür) sind die Ports 12080 und 13080 reserviert, da diese die Zertifikate in der Antwort verlangt, mit zu großen Antwortdaten aber nicht umgehen können bzw., mit der TLS Client Authentifizierung nicht zurechtkommen.

Grundsätzlich können Lösungen in beliebigen Programmierumgebungen verwendet werden, es muss folgende Unterstützung gegeben sein:

  • TLS-Unterstützung
  • HTTP-Unterstützung
  • Möglichkeit zur Erstellung eines Timestamp-Requests gemäß RFC 3161 (unterstützt wird SHA-1, SHA-256, SHA-512, RIPEMD-160)
  • Möglichkeit zur Interpretation eine Timestamp-Response gemäß RFC 3161

Ablauf:

  • Der Client verbindet sich zum Server und authentifiziert sich (entweder mittels Zertifikat beim TLS-Handshake oder mittels HTTP Authentication)
  • Der Client setzt den HTTP Content-Type auf “application/timestamp-query”.
  • Der Client schickt den Timestamp Request mittels POST an den Server.
  • Der Server schickt eine HTTP Antwort des Content-Type “application/timestamp-response” zurück, welche die Timestamp Response enthält

Eine Java Client Applikation könnte in etwa so aussehen, wenn das File request.tsq ein gültiger Timestamp Request (TSR) ist. Der TSR selbst wurde mittels OpenSSL oder BouncyCastle-Bibliothek generiert.

Beachten Sie, dass der bereitgestellte Mustercode nur eine erste Orientierung darstellt und keine Gewähr für formale, inhaltliche oder syntaktische Richtigkeit übernommen wird. Der Code soll Java-Programmierern den Einstieg in die Timestamp-Problematik erleichtern.

Nutzer anderer Programmiersprachen (C, C++, usw.) benötigen gegebenenfalls RFC3161-konforme Erweiterungen bzw. Funktionsbibliotheken. Kontaktieren Sie diesbezüglich Ihren Lieferanten für Ihre Entwicklungsumgebung. GLOBALTRUST kann dazu keinen Support leisten.

package eu.globaltrust.test;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
import org.bouncycastle.util.encoders.Base64;
public final class TSAHTTPClientWithHTTPAuth {
    private TSAHTTPClientWithHTTPAuth() {
    }
    public static void main(final String[] args) {
        // Truststore setzen; Truststore enthält GLOBALTRUST root
        // Zertifikat - notwendig, da der Client dem TLS Serverzertifikat
        // sonst nicht traut - siehe
        // http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/JSSERefGuide.html#CreateKeystore
        System.setProperty("javax.net.ssl.trustStore", "truststore-client");
        // Username und Passwort für HTTP Authentifikation setzen
        String username = "USERNAME";
        String password = "PASSWORT";
        try {
            // Laden des Timestamp request
            File fReq = new File("request.tsq");
            byte[] req = new byte[(int) fReq.length()];
            try {
                new FileInputStream(fReq).read(req);
            } catch (Exception e) {
                System.err.println("Error reading from file");
                return;
            }
            // öffnen der Netzwerkverbindung
            HttpsURLConnection conn = (HttpsURLConnection) new URL("https://timestamp.globaltrust.eu:10080")
                    .openConnection();
            // Setzen der HTTP Parameter
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/timestamp-query");
            conn.setRequestProperty("Content-Length", Integer.toString(req.length));
            // Erstellen der Authorization-Information lt. RFC 2617
            // Base64("Username:Password")
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            Base64.encode((username + ":" + password).getBytes(), bout);
            String base64Auth = bout.toString("8859_1");
            conn.setRequestProperty("Authorization", "Basic " + base64Auth);
            // Senden des Requests
            OutputStream os = conn.getOutputStream();
            os.write(req);
            conn.connect();
            os.close();
            System.out.println("Request sent.");
            // Empfangen der Response
            InputStream is = conn.getInputStream();
            byte[] resp = new byte[conn.getContentLength()];
            is.read(resp);
            is.close();
            FileOutputStream osResp = new FileOutputStream("tsatestresp.der");
            osResp.write(resp);
            osResp.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Diese Client-Applikation verwendet Authentifizierung mittels Zertifikat:

package eu.globaltrust.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import javax.net.ssl.HttpsURLConnection;
public final class TSAHTTPClientWithSSLAuth {
    private TSAHTTPClientWithSSLAuth() {
    }
    public static void main(final String[] args) {
        // Client Zertifikat bei TLS Handshake "vorweisen"
        System.setProperty("javax.net.ssl.keyStore", "zertifikat.p12");
        System.setProperty("javax.net.ssl.keyStorePassword", "PASSWORT");
        System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
        // Truststore setzen; Truststore enthält GLOBALTRUST root
        // Zertifikat - notwendig, da der Client dem TLS Serverzertifikat
        // sonst nicht traut - siehe
        // http://java.sun.com/j2se/1.4.2/docs/guide/security/jsse/JSSERefGuide.html#CreateKeystore
        System.setProperty("javax.net.ssl.trustStore", "truststore-client");
        try {
            // Laden des Timestamp request
            File fReq = new File("request.tsq");
            byte[] req = new byte[(int) fReq.length()];
            try {
                new FileInputStream(fReq).read(req);
            } catch (Exception e) {
                System.err.println("Error reading from file");
                return;
            }
            // öffnen der Netzwerkverbindung
            HttpsURLConnection conn = (HttpsURLConnection) new URL("https://timestamp.globaltrust.eu:10080")
                    .openConnection();
            // Setzen der HTTP Parameter
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/timestamp-query");
            conn.setRequestProperty("Content-Length", Integer.toString(req.length));
            // Senden des Requests
            OutputStream os = conn.getOutputStream();
            os.write(req);
            conn.connect();
            os.close();
            System.out.println("Request sent.");
            // Empfangen der Response
            InputStream is = conn.getInputStream();
            byte[] resp = new byte[conn.getContentLength()];
            is.read(resp);
            is.close();
            FileOutputStream osResp = new FileOutputStream("tsatestresp.der");
            osResp.write(resp);
            osResp.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Erstellung eines Timestamp Requests in Java

In Java mithilfe der BouncyCastle Bibliotheken geschrieben, erstellt folgendes Programm einen Timestamp Request im File request.tsq für das File doc.txt:

package eu.globaltrust.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import org.bouncycastle.asn1.ASN1ObjectIdentifier;
import org.bouncycastle.tsp.TimeStampRequest;
import org.bouncycastle.tsp.TimeStampRequestGenerator;
public final class TSQCreator {
    private TSQCreator() {
    }
    public static void main(final String[] args) {
        // Die OID des Hash Algorithmus muss bekannt sein
        String sha1Oid = "1.3.14.3.2.26";
        // Wir wollen ein Timestamp Request für doc.txt erstellen
        File doc = new File("doc.txt");
        byte[] bytes = new byte[(int) doc.length()];
        try {
            new FileInputStream(doc).read(bytes);
        } catch (Exception e) {
            System.err.println("Error reading from file");
            return;
        }
        byte[] digest;
        try {
            digest = MessageDigest.getInstance("SHA1").digest(bytes);
        } catch (NoSuchAlgorithmException e) {
            System.out.println("SHA-1 algorithm not available.");
            return;
        }
        TimeStampRequestGenerator gen = new TimeStampRequestGenerator();
        try {
            TimeStampRequest tsq = gen.generate(new ASN1ObjectIdentifier(sha1Oid), digest, new BigInteger(64,
                    SecureRandom.getInstance("SHA1PRNG")));
            try {
                new FileOutputStream("request.tsq").write(tsq.getEncoded());
            } catch (Exception e) {
                System.out.println("Error writing request.");
                return;
            }
        } catch (NoSuchAlgorithmException e) {
            System.out.println("No such algorithm: " + e.getMessage());
        }
    }
}
Das könnte Sie auch interessieren…
Was kostet es, nicht papierlos zu arbeiten?

Was kostet es, nicht papierlos zu arbeiten?

Obwohl die Digitalisierung nahezu jeden Aspekt des Arbeitsalltags erreicht hat, spielt die Unterschrift und mit ihr das Druckpapier in B2B-Umgebungen eine entscheidende Rolle - und verursacht leicht vermeidbare Kosten. Durch die Einführung elektronischer Signaturen können Unternehmen diese überflüssigen Ausgaben...

mehr lesen