【问题标题】:Use openssl in a github action在 github 操作中使用 openssl
【发布时间】:2020-10-07 03:52:47
【问题描述】:

我想将 github 操作的工件发布到特定的更新存储库,以便我的软件可以使用它来更新自身。为了验证本地更新过程中的更新,我想签署这个工件。我现在选择将更新本身和签名存储在单独的文件中。

我的 github 操作将采用压缩后的工件,并应使用给定的 RSA4096 私钥对其进行签名,并应使用 SHA512 作为摘要。

我的 github 操作如下所示:

- name: Sign release
  run: |
    echo $PRIVATE_KEY > privatekey.pem
    openssl dgst -sha512 -sign privatekey.pem -out latest.sig latest.zip
    env:
      PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}

此 github 操作应从存储库的机密中获取我的私钥,将其放入环境变量中,然后将其放入本地文件中,以便以下 openssl 命令可以使用此私钥对其进行签名。我这样做是为了阻止私钥本身被回显到日志中。

私钥值如下: (这当然不是实际的私钥,而是我仅为测试目的而创建的,直到这个 github 操作正常工作。这个私钥只有 1024 位,而不是上面提到的 4096 位。以后我不会再使用这个私钥了。 )

-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgGwdzKeZPLdOHV+/iDpHHtEk7kephhI5eythCfmoqzy5CSx+GZ6X
Z1GiIzII+CtyN69cOgyzO99uPvquBkbo3lHL5+jZnOEue8nMub8iwPXZgDB6s8BV
sFevjLENx4LWJSZSo8rUn6al3bfoWJUySzkla9xc4g0GiO1K81zGeRH9AgMBAAEC
gYBTZbUs/vYny5i69+pkUeICoEMxgiHKQw6win0AWMwl3fGmoWqvu8hV3wTZHrQY
B1XO7gxVKZigo9Du23g6EH0UhGHZm9s4csjVXm8gVt7LghoOZq82nLmbe+XBrn+C
B3VeQbk7urD5mfdWx5zRYWGPjg/zaCGu47Apuuc1Kw0vvQJBAMhbyHvua2b/Fdbm
fbpO283aTPBaHYrexsqp5DZ8/DUet7BIB/p9yb4hVpV9nDH/WALSl1stfcfe260w
Lsm4/icCQQCKJDAi/ukBW2QpFy9evMNpR0KxtFIETxs6y5v0/EOoaqKDrFjjb7M2
svEybXa/y/AgYMxxVeNbFpfWSC4Sc+k7AkA2D2XJ4qvCD6PB51EXOv3dzkAiPf5o
oPF8b1ivRwv5/T7M5rKYaOZNUct97HV/nAkQQegq5txgWIZndW+6aBrTAkACNG2o
QVVKtkC0/y+8XVrpFUAVQgGFHBYdLB7DHDugNoN9goSwrJm5p8V9vo2Epiag/aqF
rI9CZuvpeaFynfL9AkEApFCO3IxSkXYwx4AjQwxcuVz1w5lUAL5LxvRlmqy8Jj0l
RgXLxBfGTQoTVL9/JuUjE7xLXWfYm+8u9k3KV3FJYQ==
-----END RSA PRIVATE KEY-----

问题是执行此步骤时github操作的日志输出如下:

unable to load key file
6196:error:0909006C:PEM routines:get_name:no start line:crypto\pem\pem_lib.c:745:Expecting: ANY PRIVATE KEY

这意味着回显到 privatekey.pem 的内容不是实际的私钥秘密值,而是其他内容。我无法在后续测试中打印文件的内容。不是使用 necho 或 cat 命令或任何类似命令,因此我实际上不知道写入文件的内容,这使我无法深入分析。

这里有没有人能够推断出一些有用的提示或解决这个问题的方法?

【问题讨论】:

    标签: github openssl rsa github-actions


    【解决方案1】:

    您的部分问题可能是缺少引用。当您不在 shell 中引用变量时,它会在空格(空格、制表符和换行符)上拆分,因此您传递给 echo 的是几个不同的参数,它们不是由换行符分隔,而是分隔通过回显空格。

    你可能想写这个(注意$PRIVATE_KEY周围的引号:

    - name: Sign release
      run: |
        echo "$PRIVATE_KEY" > privatekey.pem
        openssl dgst -sha512 -sign privatekey.pem -out latest.sig latest.zip
        env:
          PRIVATE_KEY: ${{ secrets.PRIVATE_KEY }}
    

    一般来说,使用时最好将所有变量放在双引号中,除非您确定希望 shell 扩展它们。

    当然,所有这些仅适用于您使用 POSIX shell 的情况,这意味着您需要在 Windows 上使用 Unix 或 bash,因为您使用的语法是 POSIX shell 语法。

    与大多数 CI 系统一样,GitHub Actions 会尝试清理其输出,以防止泄露意外打印到日志中的机密,这就是您无法打印该值的原因。

    【讨论】:

    • 是的,就是这样。然而,重要的是要注意我在一台 Windows 机器上,它默认使用 powershell 来运行这些命令。引用命令,就像你的答案一样,只有在我指定shell: bash 之后才能正常工作。如果您可以将其作为附注添加到您的答案中,那将是最有帮助的。
    猜你喜欢
    • 2023-02-14
    • 2020-03-15
    • 2021-12-05
    • 2020-11-18
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2021-11-26
    • 2020-06-03
    相关资源
    最近更新 更多