Frage

Nachdem ein Glas unterzeichnet und die -tsa Option verwendet wurde, wie kann ich, dass der Zeitstempel zu validieren war im Preis enthalten? Ich habe versucht:

jarsigner -verify -verbose -certs myApp.jar

Aber der Ausgang ist nicht festgelegt, etwas über die Zeitstempel. Ich frage, weil auch wenn ich einen Tippfehler in der -tsa URL-Pfad haben, der jarsigner erfolgreich ist. Dies ist die Global TSA URL: http://timestamp.globalsign.com/scripts/timstamp.dll und der Server dahinter akzeptiert scheinbar jeden Pfad (dh. timestamp.globalsign.com/foobar), so dass am Ende bin ich mein Glas ist Zeit gestempelt oder nicht nicht wirklich sicher.

War es hilfreich?

Lösung

Nur die letzten 2 Stunden damit verbracht, für dieses Problem suchen und fand schließlich einen Weg, um festzustellen, ob eine JAR-Datei tatsächlich Zeitstempelinformationen in der Signaturblock-Datei enthalten ist. Ich konnte die Global certifcate im Hexeditor der /META-INF/FOO.DSA Datei sehen, aber ich habe kein Werkzeug, das die Informationen auszudrucken würden Sie benötigen.

Sie können die FOO.DSA Datei umbenennen, um foo.p7b es in dem Windows-CertMgr zu öffnen, aber es zeigt auch keine Zeitstempelinformationen. Ich habe auch nicht verwalten OpenSSL zu verwenden, um die DSA-Datei, um zu überprüfen (es ist PKCS # 7-Dateiformat).

So kam ich mit dem folgenden Code auf, der die Time Stamp Signerinfo und das Datum zeigen, wenn der Zeitstempel erstellt wurde. Ich hoffe, es ist ein guter Anfang für Sie. Sie müssen bcprov-jdk16-144.jar, bctsp-jdk16-144.jar und bcmail-jdk16-144.jar in dem Classpath. Holen Sie sich von BouncyCastle

package de.mhaller.bouncycastle;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.Security;
import java.util.Collection;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;

import org.bouncycastle.asn1.DEREncodable;
import org.bouncycastle.asn1.cms.Attribute;
import org.bouncycastle.asn1.cms.AttributeTable;
import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers;
import org.bouncycastle.cms.CMSException;
import org.bouncycastle.cms.CMSSignedData;
import org.bouncycastle.cms.SignerId;
import org.bouncycastle.cms.SignerInformation;
import org.bouncycastle.cms.SignerInformationStore;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.tsp.TSPException;
import org.bouncycastle.tsp.TimeStampToken;
import org.bouncycastle.tsp.TimeStampTokenInfo;

public class VerifyTimestampSignature {

    private static boolean found;

    public static void main(String[] args) throws Exception {
        if (args == null || args.length != 1) {
            System.out.println("usage: java " + VerifyTimestampSignature.class.getName()
                    + " [jar-file|dsa-file]");
            return;
        }

        BouncyCastleProvider provider = new BouncyCastleProvider();
        Security.addProvider(provider);

        String filename = args[0];

        if (filename.toLowerCase().endsWith(".dsa")) {
            InputStream dsa = new FileInputStream(filename);
            printDSAInfos(filename, dsa);
            return;
        }

        if (filename.toLowerCase().endsWith(".jar")) {
            InputStream jar = new FileInputStream(filename);
            JarInputStream jarInputStream = new JarInputStream(jar);
            JarEntry nextJarEntry;
            do {
                nextJarEntry = jarInputStream.getNextJarEntry();
                if (nextJarEntry == null) {
                    break;
                }
                if (nextJarEntry.getName().toLowerCase().endsWith(".dsa")) {
                    printDSAInfos(nextJarEntry.getName(), jarInputStream);
                }
            } while (nextJarEntry != null);
        }

        if (!found) {
            System.out.println("No certificate with time stamp information found in " + filename);
        } else {
            System.out.println("Found at least one time stamp info");
            System.out.println("Note: But it was NOT verified for validity!");
        }
    }

    private static void printDSAInfos(String file, InputStream dsa) throws CMSException,
            IOException, TSPException {
        System.out.println("Retrieving time stamp token from: " + file);
        CMSSignedData signature = new CMSSignedData(dsa);
        SignerInformationStore store = signature.getSignerInfos();
        Collection<?> signers = store.getSigners();
        for (Object object : signers) {
            SignerInformation signerInform = (SignerInformation) object;
            AttributeTable attrs = signerInform.getUnsignedAttributes();
            if (attrs == null) {
                System.err
                        .println("Signer Information does not contain any unsigned attributes. A signed jar file with Timestamp information should contain unsigned attributes.");
                continue;
            }
            Attribute attribute = attrs.get(PKCSObjectIdentifiers.id_aa_signatureTimeStampToken);
            DEREncodable dob = attribute.getAttrValues().getObjectAt(0);
            CMSSignedData signedData = new CMSSignedData(dob.getDERObject().getEncoded());
            TimeStampToken tst = new TimeStampToken(signedData);

            SignerId signerId = tst.getSID();
            System.out.println("Signer: " + signerId.toString());

            TimeStampTokenInfo tstInfo = tst.getTimeStampInfo();
            System.out.println("Timestamp generated: " + tstInfo.getGenTime());
            found = true;
        }
    }
}

Andere Tipps

https://blogs.oracle.com/mullan/entry/how_to_determine_if_a :

  

Sie können den jarsigner Dienstprogramm zu bestimmen, ob ein signiertes JAR timestamped wurde wie folgt vor:

     

jarsigner -verify -verbose -certs signed.jar

     

wo signed.jar ist der Name Ihres signierten JAR. Wenn es timestamped ist, werden die Ausgangsleitungen der folgenden umfassen, welche die Zeit es unterzeichnet wurde:

     

[entry was signed on 8/2/13 3:48 PM]

     

Wenn die JAR nicht timestamped wird, wird die Ausgabe dieser Zeilen umfasst.

Java keytool kann bestätigen, ob ein signiertes JAR ist timestamped und kann auch das Zertifikat des TSA angezeigt werden:

$ keytool -printcert -jarfile myApp.jar

...

Timestamp:

Owner: CN=GeoTrust Timestamping Signer 1, O=GeoTrust Inc, C=US
Issuer: CN=Thawte Timestamping CA, OU=Thawte Certification, O=Thawte, L=Durbanville, ST=Western Cape, C=ZA
Serial number: 5e8d2daca44665546bb587978191a8bf
Valid from: Wed Oct 31 00:00:00 GMT 2007 until: Mon Oct 30 23:59:59 GMT 2017
Certificate fingerprints:
     MD5:  E5:30:07:8E:91:8D:A0:6C:18:6D:91:2A:B6:D2:3A:56
     SHA1: 22:3C:DA:27:07:96:73:81:6B:60:8A:1B:8C:B0:AB:02:30:10:7F:CC
     SHA256: D7:B8:44:BD:39:5A:17:36:02:39:51:C6:4D:6C:81:65:45:93:AD:29:1D:DC:E4:6C:8D:79:B6:65:DF:31:0C:F6
     Signature algorithm name: SHA1withRSA
     Version: 3

...

mhaller bietet große Code (printDSAInfos). Hilft mir sehr in meiner Arbeit. Doch ein paar Änderungen erforderlich. DEREncodable Klasse wird jetzt geändert ASN1Encodable und getDERObject () Methode werden toASN1Primitive verändert. So ist der Code wie folgt aussehen

    ASN1Encodable dob = attribute.getAttrValues().getObjectAt(0);
    CMSSignedData signedData = new CMSSignedData(dob.toASN1Primitive().getEncoded());
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top