Java 21版JPackage生成的安装包无法用Ksign+Comodo证书签名
问题
我使用Oracle的JPackage构建Java应用安装程序,多年来一直通过ksigncmd工具搭配Comodo证书对安装包进行数字签名,在Java 20环境下运行完全正常,具体流程如下:
c:\Code\jthink\SongKong>"C:\Program Files\Eclipse Adoptium\jdk-20.0.2.9-hotspot\bin\jpackage" --add-launcher SongKongDebug=songkongdebug.properties --add-launcher SongKongRemote=songkongremote.properties @jpackage.txt c:\Code\jthink\SongKong>attrib -r SongKong-10.0.exe c:\Code\jthink\SongKong>C:\Apps\Code\kSign\ksigncmd /d "SongKong Installer" /du "http://jthink.net/songkong" /f c:\code\signing\comodo.pfx /p password SongKong-10.0.exe
为解决JPackage的相关问题,我切换到Java 21版本的JPackage,但执行签名操作时出现报错:An unknown error has occured. Please contact your vendor for assistance,具体流程如下:
c:\Code\jthink\SongKong>"C:\Program Files\Eclipse Adoptium\jdk-21.0.1.12-hotspot\bin\jpackage" --add-launcher SongKongDebug=songkongdebug.properties --add-launcher SongKongRemote=songkongremote.properties @jpackage.txt c:\Code\jthink\SongKong>attrib -r SongKong-10.0.exe c:\Code\jthink\SongKong>C:\Apps\Code\kSign\ksigncmd /d "SongKong Installer" /du "http://jthink.net/songkong" /f c:\code\signing\comodo.pfx /p password SongKong-10.0.exe An unknown error has occured. Please contact your vendor for assistance
想请教Java 21构建中的哪些变更导致ksigncmd无法正常工作?
可能的原因及分析
Java 21的jpackage在Windows平台的安装包构建逻辑上有几处关键变更,可能导致旧版ksigncmd签名失败:
- PE文件格式细节调整:Java 21升级了生成Windows EXE的底层工具链,对PE(Portable Executable)文件的结构、节区布局或元数据做了优化,而ksigncmd这类较旧的签名工具可能未适配新的PE格式细节,无法正确解析或修改文件内容,从而抛出未知错误。
- 默认安全强化选项启用:Java 21对jpackage生成的安装包默认开启了部分安全强化设置,比如更严格的PE校验和规则、新增的文件属性等,这些设置会干扰ksigncmd的签名流程,导致工具无法完成签名操作。
- 依赖工具链版本升级:Java 21的jpackage依赖的Windows SDK或相关构建工具版本较Java 20有所提升,生成的EXE文件使用了更新的特性,而ksigncmd未适配这些新特性,引发兼容性问题。
可通过以下步骤验证问题:
- 使用Java 21生成的EXE文件,尝试用其他签名工具(如signtool)进行签名,确认是否能正常完成,以此排除证书或文件权限问题。
- 检查ksigncmd的版本,确认是否有适配新PE格式的更新版本,升级工具后再尝试签名。
内容的提问来源于stack exchange,提问作者Paul Taylor
相关产品推荐
相关产品推荐

