如何对绑定JavaFX应用程序时创建的可执行启动器进行代码签名?
所以经过很多痛苦之后,我即将完成我的项目,现在我需要知道如何对可执行文件进行编码。不,不是.jar,我知道该怎么做。我需要的是能够对为我们的用户启动.jar的.exe文件进行代码签名,以便他们不会看到“是否允许来自未知发布者的以下程序”警告消息。如何对绑定JavaFX应用程序时创建的可执行启动器进行代码签名?
我知道如何使用INNO脚本定制进程,我可以使用它来代码签名安装程序,并且我知道如何包含将用于可执行文件和快捷方式的不同图标文件,并且我知道如何通过ANT脚本对jar进行代码签名,但是这完全没有办法。
那么,有没有人知道我怎么可以去代码签署.exe绑定自包含的JavaFX应用程序时启动jar的。
好吧,我找到了。这是非常痛苦的,因为(如果我在正确的上下文中使用这个术语)“竞争条件”在这里,如果代码签名没有完成,然后再次开始运行该过程,它会失败,因为它不能因为它正在被另一个进程使用,所以对.exe做任何事情。
只要您的IDE在Admin中运行(无论如何是Windows),就没有必要提升脚本。
无论如何,我的问题是该文件被设置为只读。很烦人,但所幸的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包创建的可执行文件进行代码签名存储在哪里?
- 创建一个WSF文件能够与JavaScript或VBScript(您 偏好)
- 添加在该文件被存储到类路径的目录(NetBeans的你去工具 - >选项 - > Java的选项卡,选择类路径旁边的添加目录,浏览到该目录并添加它)。
- 在您的WSF文件中的脚本部分,获取文件对象并将其属性设置为普通(0)。
- 然后Shell.Run您的代码签名应用程序的首选方法。 1用于显示Code Sign窗口,True用于使VBScript等待,直到完成以希望避免竞争状态。
该.exe将永远存储在WSF脚本文件的一个目录中,因此相对路径始终为<FILENAME>\<FILENAME.exe>
。
我真的,真的希望这样可以节省别人的悲伤某一天的很多...
添加如下包/窗/ 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文件是可写的添加包/ Windows/MyProject后图像。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>
我很难理解MyProject.iss文件中究竟发生了什么。我目前没有这样的文件,只是让javapackager把所有东西放在一起。我用你建议的单行创建.iss文件,并收到一个错误,说它需要一个带有AppName,AppVerName和DefaultDirName的[Setup]部分。不知道该怎么办,但是当我把它们放入时,没有签名,最终的.exe文件没有正确创建。我该怎么做呢? – 2016-07-29 20:23:08
是的.iss文件不应该是空的。当你使用javapackager时,它会为你创建一个默认的.iss文件,并在输出时会告诉你这个.iss文件保存在哪里。转到该文件夹并将.iss复制到其他地方。然后将上面的行添加到.iss文件的开头。 – 2016-08-04 17:40:11
谢谢。我只是把这个文件与iss。在代码签名之前及时执行脚本。非常精通。 – 2016-12-22 15:42:56
似乎作为创新安装5.5.9(2016年4月6日)的存在标示对可用于签署应用程序的exe文件部分“符号”。您仍然需要将.wsf文件添加到软件包/ windows文件夹,如其他答案中所示。
谢谢!这为我节省了很多时间。我只需要一种方法将文件属性更改为只读,并且您的代码运行良好! – 2015-07-31 16:11:12
至于签名,我决定让innosetup重新处理这件事。也许这将解决你所谈论的竞争条件。只需将此行添加到inno安装脚本的开头即可:#expr Exec(“C:\ Program Files(x86)\ Windows Kits \ 8.0 \ bin \ x64 \ signtool.exe”,“sign/n Concord/tr http:/ /tsa.starfieldtech.com“+ AddBackslash(SourcePath)+”MyFolder \ MyFile.exe“) – 2015-07-31 16:11:19
我很高兴这有助于某人。我看着我的电子邮件,就像“堆栈交换?什么?” – Will 2015-07-31 19:23:43