当前位置: 首页 > 知识库问答 >
问题:

使用jpackage实用程序的代码签名公证在macOS上不起作用

弘伟彦
2023-03-14

在某种情况下,我使用jpackage实用程序尝试创建一个签名的DMG文件以交付给我的用户。我需要签署这个DMG的原因是因为我想对软件进行公证。顺便说一下,我不确定是否可以使用jpackage进行公证,但我还是在尝试。

然而,我在使用jpackage的内置代码签名选项时遇到了问题,这是成功公证的先决条件。

我正在使用选项运行jpackage --mac-sign --mac-软件包签名-前缀CardrDebate --mac-签名-密钥-用户名“开发人员ID应用程序:**********(*******)”(我已经编辑了实际的开发人员ID,因为这是在StackOverflow上公开的)。

创建jpackage应用程序映像后,我通过导航到几个生成的.dylib文件并尝试codeign -vvv {filename}.dylib来测试生成的代码是否实际上已签名,并且codeign表示该对象根本没有签名(不是它是错误的签名,而是它根本没有签名)。

因此,我认为我的问题是由于我(可能)在macOS上不正确地使用了jpack的签名选项。我应该如何使用这些?

共有3个答案

姜淇
2023-03-14
匿名用户

对于我的应用程序(Unattach)的端到端工作脚本,请参见package.sh的< code>darwin一节。

尹正奇
2023-03-14

仅供参考 - 在JDK 14.0.1中深入研究了这个问题,并希望将知识作为另一个临时解决方案进行共享,直到jpackage正常工作。

在JDK 14源路径中:src/JDK.incutor.jpackage/macosx/classes/JDK/inculator/jpackage/internal

MacAppBundler文件。java包含以下行(81

其中SIGNING_KEY_USER从命令行获取--mac-signing-key-user-name参数的值。

对于这些行,使用jpackage来签署DMG总是失败。(“开发人员ID应用程序:”与我的证书名称不匹配。)

更改这些行以删除“开发者ID应用程序:”和以下“”符号。在调用jpackage时,使用证书的全名作为参数值:

--mac签名密钥用户名“第三方mac开发人员应用程序:John Smith(ABCDEFGHIJ)”

jpackage现在(显然)将构建并签署DMG。实际上我并没有尝试提交给苹果商店,所以这可能仍然是不完整的。

有趣的是,MacAppStoreBundler.java源确实包含正确的“第三方Mac开发人员应用程序:”和“第三方Mac开发人员安装程序:”前缀字符串,因此怀疑jpackager实际上调用了错误的方法 - 但尚未解决。可能jpackage需要有一些额外的参数来指定应该做什么(但你会认为“--type dmg”会调用正确的逻辑)。

复制的基本(笨拙)步骤:

    < li >从https://hg.openjdk.java.net/jdk下载源代码(选择jdk14,提交6c954123ee8d)。 < li >下载并解压缩。zip(或者。gz或. bz2)放入工作目录 < li >使用任何文本编辑器遵循" src "中的路径,并如上所述更改MacAppBundler.java。 < li >打开终端窗口,然后光盘进入" src "目录 < li >运行“全部生成”来编译整个JDK 14版 < li >运行src/build/ma cosx-x86 _ 64-server-release/images/JDK/bin/jpackage...因素...
查宜民
2023-03-14

我会继续回答我自己的问题,因为我最终想出了如何签署我的申请并从苹果公证服务处成功公证(我的产品是http://cardr.x10.bz).

>

  • 使用jpack的app-image选项生成未签名的应用包。

    使用自动 bash 脚本对应用程序捆绑包内的所有 dylib 和可执行文件进行编码,使用代码符号 -vvv --选项运行时 --深层 --强制 --签名“开发人员 ID 应用程序: ********”

    这是一个多步骤的过程,所以我将它拆分为A / B / C。

    3A)在 MyApp.app/Contents/mods/ 中查找包含嵌入式.dylib文件的所有jar文件,并将这些文件解压缩到特定文件夹(或编写一个小程序来为您执行此操作)。对我来说,我的应用程序依赖于 JavaFX,因此许多 JavaFX 库在 jar 文件中包含 .dylib 文件。但是,如果您只使用默认的 Java 库,则应该能够跳到步骤 4,因为默认的 Java 库不包含 .dylib 文件。我们需要执行此步骤的原因是,Apple的公证服务也会检查这些嵌入式.dylib文件以进行编码。

    3B)使用一个自动化的bash脚本,通过< code > code sign-vvv-options runtime-deep-force-sign " Developer ID Application:* * * * * * * "对您刚刚提取的所有dylib文件进行协同设计

    3c)将每个签名的. dylib文件添加回各自的jar文件中,以替换原始的未签名的嵌入式. dylib文件。这是一个可能会派上用场的命令:jar uf

    现在您已经签署了.app中的每个可执行文件和dylib文件,现在是时候签署.app本身了。运行codesign-vvv--force--sign“开发者ID应用程序:*********”MyApp.app

    现在您已经签署了. app,您需要在应用程序包上运行jpack以从中创建DMG或PKG。请随意使用jpack mac签名功能,它将签署外部DMG/PKG。请注意,属性--mac-signing-key-user-name"My Developer Account Name (*******)"不应包含证书的“Developer ID Application/Installer”部分。

    最后,您已经创建了一个签名的PKG/DMG,可以进行公证。使用xcrun altools--notarize-app--username

    如果公证成功(应该),您可以使用xcrun stapler stapleMyApp.pkg将应用程序的票证钉在PKG安装程序上。

    希望这有帮助!

  •  类似资料:
    • 我在macos上有IdentityServer4。Idv在本地主机上具有自签名证书。它一直有效,直到macos更新到蒙特利。无法使用Safari、Chrome和Firefox。Safari在空白页面上搜索,Chrome显示error ERR\u SSL\u PROTOCOL\u error。 该证书从6月份起一直有效,到蒙特利为止没有任何问题。 我试图做的是: 创建了密钥大小为4096的新证书。

    • 问题内容: 问题: 我正在使用OpenSAML构建对发布到我们服务器上的SAML 2.0响应进行身份验证的方法。我已经完成了大部分工作,并能够访问断言的各个方面。唯一的问题是,当我尝试使用下面的公钥来验证签名时,它指出“ 签名未针对凭证的密钥进行验证 ”。 有任何想法吗? 公钥: 签名: 实现方式: 问题答案: 好吧,事实证明上面的代码 是 正确的。样本SAML响应不正确。我想从这一切中学到的教训

    • 问题内容: 我有一个外部服务,在定义的事件发生后会给我回电,并用其私钥签署他的请求。 我已经存储了如下公钥: 因此,我的工作是通过验证签名来检查请求的内容是否未更改。 这是我的算法: 但是目前,我的算法已停止在此消息的“ PublicKey publicKey = keyFactory.generatePublic(publicKeySpec)”步骤处: 那么,如何以java api接受的方式加载

    • 给了我一个错误: javax.net.ssl.sslHandShakeException:Sun.Security.Validator.ValidatorException:PKIX路径构建失败:Sun.Security.Provider.CertPath.SunCertPathBuilderException:找不到请求目标的有效证书路径

    • 我正在使用Firebase Google登录。它可以通过USB调试完美地工作。但当我生成签名的APK时,它停止工作。无法登录。在Android5.1上使用它

    • 我有基于C的应用程序,它们是用openssl smime签名的。 我希望使用C语言通过OpenSSL编程验证这些s/mime签名。我花了很多时间搜索类似的场景,但没有得到相关页面。 我已经下载了(openssl-1.0.2a)并在LinuxEnv上编译。我已经将编译的静态库集成到我的项目中。 请让我知道如何进行签名验证,或者请指导我需要调用哪个API来验证s/mime签名。