首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何签署和公证sign中的Github操作macos运行程序

如何签署和公证sign中的Github操作macos运行程序
EN

Stack Overflow用户
提问于 2022-02-04 18:34:40
回答 1查看 903关注 0票数 4

上下文

我正在构建一个Github操作作业以构建、签名和公证PKG文件

我使用的是Apple帐户(工作流需要用户名和密码)以及带有私钥(加密)的开发人员Id安装程序证书。两者都被保存为机密(base64),并将在工作流中转换为.p12文件,然后添加到密钥链中。

这项工作是私有存储库中更大工作流的一部分,它首先从软件生成文件(使用Pyinstaller),然后在AWS S3桶上导出PKG。

实施

代码语言:javascript
复制
jobs:
  [...]

  pkg:
    needs: [...]
    runs-on: macos-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Download macos bin file
        uses: actions/download-artifact@v2
        with:
          name: macos-bin-files
          path: dist/
      - name:
        run: | 
          ----- Create certificate files from secrets base64 -----
          echo ${{ secrets.DEVELOPER_ID_INSTALLER_CER }} | base64 --decode > certificate_installer.cer
          echo ${{ secrets.DEVELOPER_ID_INSTALLER_KEY }} | base64 --decode > certificate_installer.key

          ----- Create p12 file -----
          openssl pkcs12 -export -name zup -in certificate_installer.cer -inkey certificate_installer.key -passin pass:${{ secrets.KEY_PASSWORD }} -out certificate_installer.p12 -passout pass:${{ secrets.P12_PASSWORD }}

          ----- Configure Keychain -----
          KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
          security create-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" $KEYCHAIN_PATH
          security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
          security unlock-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" $KEYCHAIN_PATH

          ----- Import certificates on Keychain -----
          security import certificate_installer.p12 -P "${{ secrets.P12_PASSWORD }}" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
          security list-keychain -d user -s $KEYCHAIN_PATH

          ----- Generate PKG from files -----
          use a macos installer script (ref: https://github.com/KosalaHerath/macos-installer-builder/tree/master/macOS-x64)

          ----- Sign PKG file -----
          productsign --sign "${{ secrets.DEVELOPER_ID_INSTALLER_NAME }}" $INPUT_FILE_PATH $OUTPUT_FILE_PATH

          - name: "Notarize Release Build PKG"
            uses: devbotsxyz/xcode-notarize@v1 
            with:
              product-path: $PATH_TO_PKG
              appstore-connect-username: ${{ secrets.APPLE_ACCOUNT_USERNAME }}
              appstore-connect-password: ${{ secrets.APPLE_ACCOUNT_PASSWORD }}
              primary-bundle-id: 'BUNDLE_ID'

          - name: "Staple Release Build"
            uses: devbotsxyz/xcode-staple@v1
            with:
              product-path: $PATH_TO_PKG

  [...]

问题

我遵循了在macOS运行程序上安装苹果证书的Github官方文档,这个部分正在按预期工作。我可以将证书添加到密钥链,并使用它来使用productsign命令对PKG文件进行签名。

但是,当我将PKG发送到Apple进行公证时,它会返回错误:

代码语言:javascript
复制
Error: Notarization status <invalid> - Package Invalid
Error: Notarization failed

我试过的

PKG在分发时按预期工作(只需要以管理员身份打开,而不是公证),因此这个问题似乎与包实现无关。

我尝试使用命令行执行公证,以下是来自不同来源的链接:

但是,即使使用这些命令行(不使用公证操作),我也无法对PKG文件进行公证。

问题

我的工作流程出了什么问题,我在试图公证包之前遗漏了什么吗?

PS:我找不到任何参考资料,做这件事在一个Github动作macos跑步者.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-02-04 18:34:40

解决方案

在设置devbotsxyz/xcode-notarize@v1字段verbose:true之后,我注意到苹果返回了一个指向JSON的链接,解释了为什么包对公证无效。

在这个JSON中,它被告知组成我的PKG的所有文件(因为我不能在上下文中使用--onefile )都是无效的,因为它们没有签名和时间戳

经过一些研究,我发现了这篇关于苹果开发者论坛的文章,并了解到PKG文件需要从内到外签名:首先,您对Pyinstaller生成的每个文件进行签名,然后对收集所有这些文件的PKG进行签名。

为此,您不能使用productsign命令(因为它只适用于.pkg、.zip和.dmg),而只能使用codesign

但是,codesign并不使用Developer Id Installer certificate,而是使用Developer Id Application certificate,所以我还必须将这个新证书添加到工作流中。

注意,由于我的PKG将由数百个文件组成,我还需要https://gist.github.com/GuillaumeFalourd/4efc73f1a6014b791c0ef223a023520a

我的最终工作流程如下所示:

代码语言:javascript
复制
jobs:
  [...]

  pkg:
    needs: [...]
    runs-on: macos-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Download macos bin file
        uses: actions/download-artifact@v2
        with:
          name: macos-bin-files
          path: dist/
      - name:
        run: | 
          ----- Create certificate files from secrets base64 -----
          echo ${{ secrets.DEVELOPER_ID_INSTALLER_CER }} | base64 --decode > certificate_installer.cer
          echo ${{ secrets.DEVELOPER_ID_INSTALLER_KEY }} | base64 --decode > certificate_installer.key
          echo ${{ secrets.DEVELOPER_ID_APPLICATION_CER }} | base64 --decode > certificate_application.cer
          echo ${{ secrets.DEVELOPER_ID_APPLICATION_KEY }} | base64 --decode > certificate_application.key

          ----- Create p12 file -----
          openssl pkcs12 -export -name zup -in certificate_installer.cer -inkey certificate_installer.key -passin pass:${{ secrets.KEY_PASSWORD }} -out certificate_installer.p12 -passout pass:${{ secrets.P12_PASSWORD }}
          openssl pkcs12 -export -name zup -in certificate_application.cer -inkey certificate_application.key -passin pass:${{ secrets.KEY_PASSWORD }} -out certificate_application.p12 -passout pass:${{ secrets.P12_PASSWORD }}

          ----- Configure Keychain -----
          KEYCHAIN_PATH=$RUNNER_TEMP/app-signing.keychain-db
          security create-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" $KEYCHAIN_PATH
          security set-keychain-settings -lut 21600 $KEYCHAIN_PATH
          security unlock-keychain -p "${{ secrets.KEYCHAIN_PASSWORD }}" $KEYCHAIN_PATH

          ----- Import certificates on Keychain -----
          security import certificate_installer.p12 -P "${{ secrets.P12_PASSWORD }}" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
          security import certificate_application.p12 -P "${{ secrets.P12_PASSWORD }}" -A -t cert -f pkcs12 -k $KEYCHAIN_PATH
          security list-keychain -d user -s $KEYCHAIN_PATH

          ----- Codesign files with script -----
          use a script to sign each file from the artifact (ref: https://gist.github.com/GuillaumeFalourd/4efc73f1a6014b791c0ef223a023520a)

          ----- Generate PKG from codesigned files -----
          use a macos installer script (ref: https://github.com/KosalaHerath/macos-installer-builder/tree/master/macOS-x64)

          ----- Sign PKG file -----
          productsign --sign "${{ secrets.DEVELOPER_ID_INSTALLER_NAME }}" $INPUT_FILE_PATH $OUTPUT_FILE_PATH

          - name: "Notarize Release Build PKG"
            uses: devbotsxyz/xcode-notarize@v1 
            with:
              product-path: $PATH_TO_PKG
              appstore-connect-username: ${{ secrets.APPLE_ACCOUNT_USERNAME }}
              appstore-connect-password: ${{ secrets.APPLE_ACCOUNT_PASSWORD }}
              primary-bundle-id: 'BUNDLE_ID'

          - name: "Staple Release Build"
            uses: devbotsxyz/xcode-staple@v1
            with:
              product-path: $PATH_TO_PKG

  [...]
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70991268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档