2009-05-27 6 views
3

Попытка запросить временную метку (RFC 3161) с помощью BouncyCastle и подключения к http://timestamping.edelweb.fr/service/tsp. Я получаю TimestampResponse обратно с сервера, но, похоже, без фактической даты.Ответ на метку времени неверен - BouncyCastle

Это код:

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(); 
    } 
} 

Вот вопрос (ы): Кто-нибудь использовал библиотеку BouncyCastle для меток времени и происходит, чтобы узнать о различных кодах состояния и что они означают? Или просто в общем, почему это не работает.

Эта линия, где я ожидал увидеть дату просто бросает NullPointer:

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

Кто-нибудь знает о любых других RFC 3161-совместимых серверов временных меток, которые свободны?

Если вы хотите запустить код, вам понадобятся баны bouncycastle, которые могут быть загружены с here. Вам понадобятся: поставщик, почта, tsp.

Благодаря

ответ

1

Проблема заключается в том, что содержимое имеет неправильный формат/длину.

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

Но что я послал в просто:

"hello".getBytes(); 

Создание надлежащего SHA1Digest от «привет» и эту работу просто отлично.

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; 

Я также закончил с использованием Digistamp как мой ВСТ, поскольку они поддерживают HTTP-аутентификации, которая была требованием.

0

this Я нашел сайт, который является довольно хорошим ресурсом для отметки времени, а также имеет список серверов, и по крайней мере некоторые из них, кажется, все еще работает.

+1

Ссылка не работает (404) –

3

Анализ связи с wirehark, этот пример дает мне ошибку «плохое сообщение». Код для дайджест, который работает для меня:

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