Есть ли способ распечатать java файл java? У меня есть некоторые подписанные банки, которые я пытаюсь использовать в моей среде разработки, но я получаю исключения безопасности, поэтому я хочу отладить эти банки, и я могу их подписать позже, когда я буду готов к развертыванию.
Как я могу выровнять банку?
Ответ 1
Я не знаю ответа, но вот что я буду делать:
- Разархивируйте файл jar или файлы, о которых идет речь (банки просто застегиваются на молнии)
- Посмотрите в каталог META-INF для того, что не было MANIFEST-MF.
- Удалите этот материал.
- Откройте MANIFEST-MF и удалите материал, похожий на подпись.
- rejar.
Ответ 2
Чтобы удалить подпись из файла jar, удалите из нее каталог META-INF
. Файл jar - это zip файл, поэтому на Linux вы можете сделать это:
zip -d file.jar 'META-INF/*.SF' 'META-INF/*.RSA'
Если у вас много файлов jar для unsign, следующая команда выполняет это в каждом файле jar в текущем каталоге и ниже:
find . -name '*.jar' -exec zip -d '{}' 'META-INF/*.SF' 'META-INF/*.RSA' ';'
Ответ 3
Я вижу, что ответ уже принят, но я думаю, что это может быть полезно в любом случае:
Я приготовил что-то (частично из других сообщений), чтобы автоматизировать задачу.
Поставляется без каких-либо гарантий, но это работает для меня:)
Копирует файл Jar при удалении информации подписи.
Обратите внимание, что MANIFEST остается только с разделом MAIN!
Используйте javac JarUnsigner.java
для создания файла .class
Используйте java -cp <class dir> JarUnsigner <inJar> <outJar>
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
public class JarUnsigner {
private static final String MANIFEST = "META-INF/MANIFEST.MF";
public static void main(String[] args){
if (args.length!=2){
System.out.println("Arguments: <infile.jar> <outfile.jar>");
System.exit(1);
}
String infile = args[0];
String outfile = args[1];
if ((new File(outfile)).exists()){
System.out.println("Output file already exists:" + outfile);
System.exit(1);
}
try{
ZipFile zipFile = new ZipFile(infile);
final ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(outfile));
for (Enumeration e = zipFile.entries(); e.hasMoreElements();) {
ZipEntry entryIn = (ZipEntry) e.nextElement();
if (! exclude_file( entryIn.getName() ) ) {
/* copy the entry as-is */
zos.putNextEntry( new ZipEntry( entryIn.getName() ));
InputStream is = zipFile.getInputStream(entryIn);
byte[] buf = new byte[1024];
int len;
while ((len = (is.read(buf))) > 0) {
zos.write(buf, 0, len);
}
zos.closeEntry();
} else {
if (MANIFEST.equals(entryIn.getName())){
/* if MANIFEST, adjust the entry */
zos.putNextEntry(new ZipEntry(MANIFEST));
// manifest entries until first empty line. i.e. the 'MainAttributes' section
// (this method is used so to keep the formatting exactly the same)
InputStream mIS = zipFile.getInputStream(entryIn);
BufferedReader in = new BufferedReader(new InputStreamReader(mIS));
String line = in.readLine();
byte[] mNL = "\n".getBytes("UTF-8");
while( line != null && !line.trim().isEmpty() ) {
zos.write( line.getBytes("UTF-8"));
zos.write( mNL );
line = in.readLine();
}
zos.write( mNL );
zos.closeEntry();
}else{
/* else: Leave out the Signature files */
}
}
}
zos.close();
System.out.println("Successfully unsigned " + outfile);
}catch(IOException ex){
System.err.println("Error for file: " + infile);
ex.printStackTrace();
System.exit(1);
}
}
/**
* Exclude .SF signature file
* Exclude .RSA and DSA (signed version of .SF file)
* Exclude SIG- files (unknown sign types for signed .SF file)
* Exclude Manifest file
* @param filename
* @return
*/
public static boolean exclude_file(String filename){
return filename.equals("META-INF/MANIFEST.MF") ||
filename.startsWith("META-INF/SIG-") ||
filename.startsWith("META-INF/") && ( filename.endsWith(".SF") || filename.endsWith(".RSA") || filename.endsWith(".DSA") );
}
}
Используйте в ANT, чтобы выровнять кучу банок следующим образом:
<apply executable="java" dest="${output-dir}">
<arg value="-cp" />
<arg value="${dev-dir}" />
<arg value="JarUnsigner" />
<srcfile/>
<targetfile/>
<fileset dir="${input-dir}" includes="*.jar"/>
<mapper type="glob" from="*.jar" to="*.jar"/> <!-- uses "dest"-->
</apply>
Ответ 4
Я успешно проверил ответ DwB с небольшой модификацией: Есть ли быстрый способ удалить файл из Jar/war без необходимости извлекать банку и воссоздать ее?, удаление только из инструмента jar невозможно. Мне нужно было внести лишь небольшие изменения в фирменную сборку script, и я не хотел перекрашивать всю банку.
Я понял, что unsign был возможен, когда я сделал только важный .RSA файл нулевого размера. Это можно выполнить только с помощью команды jar u
:
cd %JAR_DIR%
jar xvf myapp.jar META-INF/MYAPP.RSA
type nul > META-INF/MYAPP.RSA
jar uvf myapp.jar META-INF/MYAPP.RSA
rmdir /S/Q META-INF
Ответ 5
Если банки были разработаны вами тогда, им можно доверять, и вам, вероятно, не нужно их подписывать. Однако, если вы получили их извне, вам следует изучить причины возникновения безопасности, прежде чем использовать их.
Ответ 6
Если вы посмотрите на инструмент jarsigner и что он делает, он генерирует 3 вещи: 1).SF файл (файл подписи) 2) файл блока подписи на основе используемого алгоритма (например,.RSA,.DSA и т.д.), 3) изменение или создание файла MANIFEST.MF
Резюме: Для "unsign a jar" просто удалите первые 2 файла (.sf и .dsa/rsa FILE). Удалите файл MANIFEST.MF или откройте его и удалите все хэши, перечисленные для каждого .class и других файлов, перечисленных там).
Итак, если вы удалите ВСЕ в каталоге META-INF, вы рискуете удалить другие ресурсы банки, которые могут потребоваться (например, файлы свойств и т.д.). Этот "подход с дробовиком" для удаления всего, что "выглядит подписи" вреден, и не следует принципу: 1-й не навредить (для вашего .jar).
см. здесь: https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jarsigner.html
https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html
Понимание подписи и проверки
"... Когда вы подписываете JAR файл, ваш открытый ключ помещается в архив вместе с соответствующим сертификатом, чтобы он был легко доступен для использования любым, кто хочет проверить вашу подпись.... Дайджесты и файл подписи
Когда вы подписываете JAR файл, каждому файлу в архиве присваивается запись дайджеста в манифесте архива. Вот пример того, как выглядит такая запись:
Имя: test/classes/ClassOne.class SHA1-дайджест: TD1GZt8G11dXY2p4olSZPc5Rj64 =
Когда файл JAR подписан, файл подписи автоматически создается и помещается в каталог метаданных JAR файла META-INF, тот же каталог, который содержит манифест архива. Файлы подписи имеют имена файлов с расширением .SF.
Файл блока подписи
В дополнение к файлу подписи файл блока подписи автоматически помещается в каталог META-INF при подписании файла JAR. В отличие от файла манифеста или файла подписи файлы блоков подписи не читаются человеком.
Файл блока подписи содержит два элемента, необходимых для проверки:
Цифровая подпись для файла JAR, которая была создана с помощью закрытого ключа подписывающего лица Сертификат, содержащий открытый ключ подписчика, который будет использоваться любым, кто хочет проверить подписанный файл JAR Обычно имена файлов блоков подписей будут иметь расширение .DSA, указывающее, что они были созданы с помощью алгоритма цифровой подписи по умолчанию. Другие расширения имен файлов возможны, если для подписания используются ключи, связанные с каким-либо другим стандартным алгоритмом.