如何对绑定JavaFX应用程序时创建的可执行启动器进行代码签名?

如何对绑定JavaFX应用程序时创建的可执行启动器进行代码签名?,java,windows,ant,javafx,code-signing,Java,Windows,Ant,Javafx,Code Signing,所以在经历了很多痛苦之后,我即将完成我的项目,现在我需要知道如何对可执行文件进行代码签名。不,不是.jar,我知道怎么做。我需要的是能够对为用户启动.jar的.exe文件进行代码签名,这样他们就不会看到来自未知发布者的“是否允许以下程序”警告消息 我知道如何用INNO脚本定制流程,我可以用它对安装程序进行代码签名,我知道如何包含不同的图标文件,这些图标文件将用于可执行文件和快捷方式,我知道如何通过ANT脚本对jar进行代码签名,但我完全无法做到这一点 那么,有人知道我如何对绑定自包含JavaFX

所以在经历了很多痛苦之后,我即将完成我的项目,现在我需要知道如何对可执行文件进行代码签名。不,不是.jar,我知道怎么做。我需要的是能够对为用户启动.jar的.exe文件进行代码签名,这样他们就不会看到来自未知发布者的“是否允许以下程序”警告消息

我知道如何用INNO脚本定制流程,我可以用它对安装程序进行代码签名,我知道如何包含不同的图标文件,这些图标文件将用于可执行文件和快捷方式,我知道如何通过ANT脚本对jar进行代码签名,但我完全无法做到这一点


那么,有人知道我如何对绑定自包含JavaFX应用程序时启动jar的.exe进行代码签名吗?

好的,我找到了。这是非常痛苦的,因为如果我在正确的上下文竞争条件中使用这个术语,如果代码签名没有在您再次开始运行该进程之前完成,它将失败,因为它无法处理.exe,因为它正被另一个进程使用

事实证明,只要IDE在AdminforWindows中运行,就不需要提升脚本

总之,我的问题是文件被设置为只读。非常烦人,但幸运的是,VBScript允许您更改文件属性,因此在尝试对其进行代码签名之前只需执行以下操作:

<?xml version = "1.0" ?>
<package>
    <job id="CodeSign">
    <script language = "VBScript">
        <![CDATA[    
            'Set File as Normal. . .

            Dim objFSO, objFile
            Set objFSO = CreateObject("Scripting.FileSystemObject")
            Set objFile = objFSO.GetFile("<Relative Path>\<File.exe>")
            objFile.Attributes = 0

            Dim Shell
            Set Shell = WScript.CreateObject("WScript.Shell")
            Shell.Run "<Code Sign> ""<Relative Path>\<File.exe>""", 1, True
            Set Shell = Nothing
            Set objFSO = Nothing
            Set objFile = Nothing
        ]]>
    </script>
    </job>
</package>
所以,现在,最后,我们终于有了一个完整可行的答案,显然是一个非常深奥的问题,除了我自己,没有人处理过,或者是一个非常保守的秘密,我不确定是哪一个:在存储JavaFX包创建的可执行文件之前,如何对其进行代码签名

使用JavaScript或VBScript创建WSF文件 偏爱 将存储文件的目录添加到NetBeans的类路径中。您可以转到工具->选项->Java选项卡,选择类路径旁边的添加目录,浏览到该目录,然后添加它。 在WSF文件的脚本部分,获取文件对象并将其属性设置为正常0。 然后,运行您喜欢的代码签名应用程序方法。1用于显示代码符号窗口,True用于使VBScript等待完成,以避免出现竞争条件。 exe将始终存储在WSF脚本文件的上一个目录中,因此相对路径始终为\


我真的,真的希望有一天这能帮某人省去很多悲伤…

在package/windows/MyProject.iss文件的第一行添加以下内容:

#expr Exec("C:\Program Files (x86)\Windows Kits\8.0\bin\x64\signtool.exe", "sign /n CompanyName /tr tsa.starfieldtech.com " + AddBackslash(SourcePath) + "MyProject\MyProject.exe")
要确保exe文件可写,请添加package/windows/MyProject-post-image.wsf:

<?xml version = "1.0" ?>
<package>
    <job id="CodeSign">
    <script language = "VBScript">
        <![CDATA[    
            'Set File as Normal. . .

            Dim objFSO, objFile
            Set objFSO = CreateObject("Scripting.FileSystemObject")
            Set objFile = objFSO.GetFile("MyProject\MyProject.exe")
            objFile.Attributes = 0

        ]]>
    </script>
    </job>
</package>

似乎从Inno Setup 5.5.9 2016-04-06起,文件部分有“签名”标志,可用于对应用程序exe进行签名。您仍然需要将.wsf文件添加到package/windows文件夹,如其他答案所示


非常感谢。这节省了我很多时间。我只是需要一种方法来改变文件属性为只读,你的代码工作得很好!至于签名,我决定让innosetup reprocessing负责。也许这会修正你所说的比赛条件。只需将这一行添加到inno安装脚本的开头:expr exec:\Program Files x86\Windows Kits\8.0\bin\x64\signtool.exe,sign/n Concord/tr+AddBackslashSourcePath+MyFolder\MyFile.exe我很高兴这对某人有所帮助。我看了看我的电子邮件,就像是Stack exchange?什么?很惊讶没有更多的选票。任何试图使用Javafx ant构建和签署捆绑包安装程序的人都肯定会面临这个问题。@drenda我将此解决方案作为一个新的答案发布在下面,我很难准确理解MyProject.iss文件中的内容。我目前没有这样的文件,只是让javapackager帮我把所有的东西都放在一起。我使用您建议的单行创建了.iss文件,并收到一个错误,该错误表示需要使用AppName、AppVerName和DefaultDirName的[Setup]部分。我不知道该怎么办,但当我把这些放进去时,没有任何东西被签名,最终的.exe文件也没有正确创建。我该怎么做?是的,你的.iss文件不应该是空的。当您使用javapackager时,它将为您创建一个默认的.iss文件,并在输出中告诉您该.iss文件的保存位置。转到该文件夹并将.iss复制到其他地方。然后将上面用于签名exe的行添加到.iss文件的开头。谢谢。我只是把这个文件放在国际空间站。在代码签名之前,及时执行脚本。知识渊博。