Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 签名launch4j生成的exe会损坏它_Java_Exe_Sign_Launch4j - Fatal编程技术网

Java 签名launch4j生成的exe会损坏它

Java 签名launch4j生成的exe会损坏它,java,exe,sign,launch4j,Java,Exe,Sign,Launch4j,我通过Eclipse生成了一个可执行的jar文件(它是一个GUI应用程序,不需要控制台),然后通过launch4j为windows生成一个exe文件。 这一切都很好,正如预期的那样(程序仍然按照它应该的方式运行),但病毒总数显示为假阳性,在快速搜索后,我发现签名我的可执行文件是解决这一问题的一种方法 多次尝试签名my jar后,使用以下命令作为尝试: "C:\Program Files (x86)\Launch4j\sign4j\sign4j.exe" java -jar jsign-2.1.j

我通过Eclipse生成了一个可执行的jar文件(它是一个GUI应用程序,不需要控制台),然后通过launch4j为windows生成一个exe文件。 这一切都很好,正如预期的那样(程序仍然按照它应该的方式运行),但病毒总数显示为假阳性,在快速搜索后,我发现签名我的可执行文件是解决这一问题的一种方法

多次尝试签名my jar后,使用以下命令作为尝试:

"C:\Program Files (x86)\Launch4j\sign4j\sign4j.exe" java -jar jsign-2.1.jar --alias 'example.org' --keystore 'keystore.pfx' --storepass 'pass' --storetype PKCS12 'progam.exe'

"C:\Program Files (x86)\Launch4j\sign4j\sign4j.exe" -s keyfile.pfx -a "(codesign_1091_es_sw_kpsc)" --storepass pass --storetype pkcs12 -n Client -u https://www.example.org program.exe

"C:\Program Files (x86)\Launch4j\sign4j\sign4j.exe" --verbose signtool.exe sign /fd SHA256 /f keyfile.pfx /p pass /t http://timestamp.verisign.com/scripts/timstamp.dll my_signed.exe
这些似乎都不起作用,第一次尝试将从sign4j.exe输出帮助消息(好像没有提供任何参数)。 第二次尝试将输出:

Making temporary file
'"keyfile.pfx"' is not recognized as an internal or external command,
operable program or batch file.
'"keyfile.pfx"' is not recognized as an internal or external command,
operable program or batch file.
第三次尝试(在为signtool.exe设置windows 10 sdk之后) 只会说“无法打开文件”(甚至没有指定哪个文件)

然后,我在sign4jgithub上看到了一些文档,其中包含一些示例代码,您可以导入库并通过java文件对exe进行签名。因此,我尝试了一下,并编写了以下脚本:

import java.io.File;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;

import net.jsign.KeyStoreUtils;
import net.jsign.PESigner;
import net.jsign.pe.PEFile;

public class Sign4j {

    public static void main(String[] args) {
        KeyStore keystore;
        try {
            keystore = KeyStoreUtils.load(new File("keystore.pfx"), "PKCS12", "pass", null);

            PESigner signer;
            try {
                signer = new PESigner(keystore, "RuneRealm.org", "vnSsmwj4TYeurUYQ");

                signer.withProgramName("Client")
                   .withProgramURL("https://www.example.org")
                   .withTimestamping(true)
                   .withTimestampingAutority("http://timestamp.comodoca.com/authenticode");

                try {
                    signer.sign(new PEFile(new File("Program.exe")));
                } catch (Exception e) {
                    e.printStackTrace();
                }

            } catch (UnrecoverableKeyException | NoSuchAlgorithmException | KeyStoreException e) {
                e.printStackTrace();
            }

        } catch (KeyStoreException e1) {
            e1.printStackTrace();
        }
    }
}
最后,它成功了!或者看起来是这样。。 没有生成输出,程序被更改(上次更改日期已更新),现在我再次通过virustotal进行了更改,错误的帖子消失了。我对自己感到非常满意,我尝试运行该程序,但它会弹出错误:

Error: Invalid or corrupt jarfile (path to my signed exe)
在这一点上,我不知道从这里去哪里?我一直在寻找签名exe的其他替代方法,几乎所有的搜索结果都指向一个用于签名的命令,类似于我的3次尝试中的一次(没有一次成功)

我最接近的方法是使用java脚本,但由于我似乎在每个地方都读到的唯一解决方案是“使用jsign签名将避免损坏”,而这不起作用,我不确定如何继续

我已经考虑了launch4j的替代方案,例如jar2exe。它甚至无法生成可工作的exe,通过launch4j生成的exe工作得非常好,甚至保持了系统托盘和其他库的支持(这些库已经打包在可执行jar中)