2009-05-27 21 views
3

Versuchen Sie, einen Zeitstempel (RFC 3161) anzufordern, indem Sie BouncyCastle verwenden und eine Verbindung zu http://timestamping.edelweb.fr/service/tsp herstellen. Ich bekomme eine TimestampResponse vom Server zurück, aber es scheint ohne ein aktuelles Datum zu sein.Timestamp Response ist falsch - BouncyCastle

Dies ist der Code:

public static void main(String[] args) { 
    String ocspUrl = "http://timestamping.edelweb.fr/service/tsp"; 
    byte[] digest = "hello".getBytes(); 
    OutputStream out = null; 

    try { 
     TimeStampRequestGenerator reqgen = new TimeStampRequestGenerator(); 
     TimeStampRequest req = reqgen.generate(TSPAlgorithms.SHA1, digest); 
     byte request[] = req.getEncoded(); 

     URL url = new URL(ocspUrl); 
     HttpURLConnection con = (HttpURLConnection) url.openConnection(); 

     con.setDoOutput(true); 
     con.setDoInput(true); 
     con.setRequestMethod("POST"); 
     con.setRequestProperty("Content-type", "application/timestamp-query"); 

     con.setRequestProperty("Content-length", String.valueOf(request.length)); 
     out = con.getOutputStream(); 
     out.write(request); 
     out.flush(); 

     if (con.getResponseCode() != HttpURLConnection.HTTP_OK) { 
      throw new IOException("Received HTTP error: " + con.getResponseCode() + " - " + con.getResponseMessage()); 
     } 
     InputStream in = con.getInputStream(); 
     TimeStampResp resp = TimeStampResp.getInstance(new ASN1InputStream(in).readObject()); 
     TimeStampResponse response = new TimeStampResponse(resp); 
     response.validate(req); 
     System.out.println(response.getTimeStampToken().getTimeStampInfo().getGenTime()); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Hier ist die Frage (n): Hat jemand BouncyCastle Bibliothek für Zeitstempel verwendet, und geschieht über die verschiedenen Statuscodes kennen und was sie bedeuten? Oder ganz allgemein, warum das nicht zu funktionieren scheint.

Diese Linie, wo ich erwarte, dass ein Datum sehen nur eine Nullpointer wirft:

System.out.println(response.getTimeStampToken().getTimeStampInfo().getGenTime()); 

jemand von irgendwelchen anderen RFC 3161 konforme Zeitstempel-Server Weiß, die frei sind?

Wenn Sie den Code ausführen möchten, benötigen Sie die Bouncycastle-Gläser, die von here heruntergeladen werden können. Sie benötigen: Provider, Mail, TL.

Dank

Antwort

1

Das Problem scheint zu sein, dass der Inhalt das falsche Format/Länge hat.

TimeStampRequest req = reqgen.generate(TSPAlgorithms.SHA1, digest); 

Aber was ich eingesandt war einfach:

"hello".getBytes(); 

eine richtige SHA1Digest von 'hallo' erstellen und diese Arbeit gut.

static public byte[] calculateMessageDigest() 
     throws NoSuchAlgorithmException, IOException { 
    SHA1Digest md = new SHA1Digest(); 

    byte[] dataBytes = "helloooooooooooooo".getBytes(); 
    int nread = dataBytes.length; 
    md.update(dataBytes, 0, nread); 
    byte[] result = new byte[32]; 
    md.doFinal(result, 0); 
    return result; 

Ich landete auch Digistamp als meine TSA mit bis da sie HTTP-Authentifizierung unterstützen, die eine Anforderung war.

0

fand ich this Website, die eine ziemlich gute Quelle für Zeitstempel ist, und es hat auch eine Liste von Servern und scheint zumindest einige von ihnen immer noch in Betrieb ist.

+1

Der Link ist gebrochen (404) –

3

Analysiert die Kommunikation mit Wireshark, gibt mir dieses Beispiel einen "Bad Message Digest" -Fehler. Ein Digest-Code, der funktioniert für mich ist:

MessageDigest messageDigest = MessageDigest.getInstance("SHA-1"); 
    messageDigest.update("messageImprint".getBytes()); 
    byte[] digest = messageDigest.digest();