سؤال

أرغب في توقيع جرة باستخدام Jarsigner ، ثم تحقق من ذلك باستخدام تطبيق Java الذي لا يحتوي على جرة موقعة كجزء من ClassPath (أي فقط باستخدام موقع نظام الملفات للجرة)

الآن مشكلتي هي إخراج ملف التوقيع من الجرة ، هل هناك طريقة بسيطة للقيام بذلك؟

لقد لعبت لعبة مع inflater و jar inputstreams مع عدم وجود حظ.

أم أن هذا شيء يمكن إنجازه بطريقة أفضل؟

شكرًا

هل كانت مفيدة؟

المحلول

ال دليل تنفيذ مزود الأمن يحدد عملية التحقق من الجرار. على الرغم من أن هذه التعليمات مخصصة لمزود خدمة تشفير JCA للتحقق من نفسه ، إلا أنها يجب أن تكون قابلة للتطبيق على مشكلتك.

على وجه التحديد ، تحقق من verify(X509Certificate targetCert) الطريقة في رمز العينة ، "myjce.java".

نصائح أخرى

يمكنك ببساطة فتح الجرة مع java.util.jar.jarfile وإخبارها بالتحقق من ملف الجرة. إذا تم توقيع الجرة ، فسيكون لدى Jarfile خيار التحقق منه (والذي يكون افتراضيًا). ومع ذلك ، سيفتح Jarfile أيضًا الجرار غير الموقعة بسعادة ، وبالتالي يجب عليك أيضًا التحقق ، سواء تم توقيع الملف أم لا. يمكنك القيام بذلك عن طريق التحقق من بيان الجرة للسمات *-digest: يتم توقيع عناصر ذات سمة السمة هذه.

مثال:

JarFile jar = new JarFile(new File("path/to/your/jar-file"));

// This call will throw a java.lang.SecurityException if someone has tampered
// with the signature of _any_ element of the JAR file.
// Alas, it will proceed without a problem if the JAR file is not signed at all
InputStream is = jar.getInputStream(jar.getEntry("META-INF/MANIFEST.MF"));
Manifest man = new Manifest(is);
is.close();

Set<String> signed = new HashSet();
for(Map.Entry<String, Attributes> entry: man.getEntries().entrySet()) {
    for(Object attrkey: entry.getValue().keySet()) {
        if (attrkey instanceof Attributes.Name && 
           ((Attributes.Name)attrkey).toString().indexOf("-Digest") != -1)
            signed.add(entry.getKey());
    }
}

Set<String> entries = new HashSet<String>();
for(Enumeration<JarEntry> entry = jar.entries(); entry.hasMoreElements(); ) {
    JarEntry je = entry.nextElement();
    if (!je.isDirectory())
        entries.add(je.getName());
}

// contains all entries in the Manifest that are not signed.
// Ususally, this contains:
//  * MANIFEST.MF itself
//  * *.SF files containing the signature of MANIFEST.MF
//  * *.DSA files containing public keys of the signer

Set<String> unsigned = new HashSet<String>(entries);
unsigned.removeAll(signed);

// contains all the entries with a signature that are not present in the JAR
Set<String> missing = new HashSet<String>(signed);
missing.removeAll(entries);

يمكنك استخدام intrad.getCodesigners () للحصول على الموقّعين لإدخال معين في الجرة.

تأكد من فتح jarfile مع التحقق = صحيح وقراءة إدخال الجرة بالكامل قبل استدعاء intpling.getCodesigners ().

يمكن استخدام شيء من هذا القبيل للتحقق من كل إدخال ليس ملف توقيع:

boolean verify = true;
JarFile jar = new JarFile(signedFile, verify);

// Need each entry so that future calls to entry.getCodeSigners will return anything
Enumeration<JarEntry> entries = jar.entries();
while (entries.hasMoreElements()) {
   JarEntry entry = entries.nextElement();
   IOUtils.copy(jar.getInputStream(entry), new NullOutputStream());
}

// Now check each entry that is not a signature file
entries = jar.entries();
while (entries.hasMoreElements()) {
    JarEntry entry = entries.nextElement();
    String fileName = entry.getName().toUpperCase(Locale.ENGLISH);
    if (!fileName.endsWith(".SF")
       && !fileName.endsWith(".DSA")
       && !fileName.endsWith(".EC")
       && !fileName.endsWith(".RSA")) {

       // Now get code signers, inspect certificates etc here...
       // entry.getCodeSigners();
    }
 }

يمكنك استخدام تطبيق Jarsigner للقيام بذلك. في ProcessBuilder (أو Runtime.exec) يمكنك تشغيل الأمر مع هذه الوسائط

 ProcessBulider pb = new ProcessBuilder("/usr/bin/jarsigner", "-verify", "-certs", f.getAbsolutePath());

وإذا تم التحقق من كونتيطاليات الإخراج ، فسيتم توقيع الجرة

Process p = pb.start();
p.waitFor();
InputStream is = p.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null)
{
if(line.contains("verified");
...

هناك أشياء أكثر تعقيدًا يمكنك القيام بها عندما يكون لديك إخراج رمز Jarsigner.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top