Recently one of our customer service folks was fighting this same problem at a customer site. To make matters worse, they were not familiar with Groovy, so using my previous script was not an option. I decided to bite the bullet and write the Java equivalent.
Below is my Java-equivalent of the Groovy script. The code is saved as the JarSigners project at GitHub.
package util;
import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipException;
import java.util.zip.ZipFile;
/**
* Show which jars are signed with which code signing certificates
*/
public class JarSigners {
private String folderName;
private Map> map;
private Set certs;
public JarSigners(String folderName) {
this.folderName = folderName;
map = new HashMap>();
certs = new HashSet();
}
public void listJarSigners() throws ZipException, IOException {
File dir = new File(folderName);
FilenameFilter filter = new FilenameFilter() {
public boolean accept(File dir, String name) {
return name.endsWith(".jar");
}
};
String[] files = dir.list(filter);
System.out.println("Found "+files.length+" files in folder: "+folderName);
for (String fileName : files) {
checkJarForCertificate(fileName);
}
System.out.println("Certificates used to sign the jars: "+certs);
if (certs.size() > 1) {
System.out.println("WARNING: More that one certificate shows up in the jars!");
}
System.out.println("Details jar->certificate: "+map);
}
private void checkJarForCertificate(String fileName) throws ZipException, IOException {
File jar = new File(folderName, fileName);
ZipFile zip = new ZipFile(jar);
//System.out.println("Processing "+fileName);
for (Enumeration entries = zip.entries(); entries.hasMoreElements();) {
// Get the entry name
String zipEntryName = ((ZipEntry)entries.nextElement()).getName();
if (zipEntryName.endsWith(".RSA")) {
if (!certs.contains(zipEntryName)) {
certs.add(zipEntryName);
}
if (map.containsKey(fileName)) {
List list = map.get(zipEntryName);
list.add(zipEntryName);
} else {
List list = new ArrayList();
list.add(zipEntryName);
map.put(fileName, list);
}
}
}
zip.close();
}
/**
* @param args
* @throws IOException
* @throws ZipException
*/
public static void main(String[] args) throws ZipException, IOException {
if (args.length != 1) {
System.out.println("Invalid invocation: you must pass a folder name");
return;
}
JarSigners js = new JarSigners(args[0]);
js.listJarSigners();
System.out.println("Done!");
}
}
Hope this helps!

