在github操作中使用openssl

问题描述

我想将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命令或类似命令,因此实际上我不知道写入文件的内容,这使我无法更深入地进行分析。

这里有人可以推断出一些有用的提示或解决此问题的方法吗?

解决方法

您的部分问题可能是缺少报价。如果您在外壳程序中未引用变量,则该变量会在空格(空格,制表符和换行符)上分开,因此您传递给<input type="radio" id="a1" name="radio" value="1" onclick="jump('one')"><label for="a1">one</label> <input type="radio" id="a2" name="radio" value="2" onclick="jump('two')"><label for="a2">two</label> <input type="radio" id="a3" name="radio" value="3" onclick="jump('three')"><label for="a3">three</label> <input type="radio" id="a4" name="radio" value="4" onclick="jump('four')"><label for="a4">four</label> <input type="radio" id="a5" name="radio" value="5" onclick="jump('five')"><label for="a5">five</label> <input type="radio" id="a6" name="radio" value="6" onclick="jump('six')"><label for="a6">six</label> <input type="radio" id="a7" name="uno" value="7" onclick="jump('two')"><label for="a7">&lowast; two</label> <input type="radio" id="a8" name="due" value="8" onclick="jump('five')"><label for="a8">&lowast; five</label> <a href="">&lowast;</a> <div id="first"> <p id="one"><b>ONE</b> simplest js content switcher </p> <p id="two"><b>TWO</b> this is <i>&lt;p id="two"&gt;</i> as a <i>:target</i> of js function <i>jump('two')</i></p> <p id="three"><b>THREE</b> ... </p> </div> <details><summary>click me to change content size</summary>Limitations:<ul><li>using js is now (almost) safe - browsers finally support events,recently even Safari,but on older devices - content will be unavailble</li><li>this kind of layout is not inherently responsive - it can be done well,even mobile-first (latest approach) but it's not easy</li><li>all content is loaded on startup (using &lt;iframe&gt; only partially)</li><li>in case of css loading failure the page will be ugly - don't use multiple or huge css files</li></ul> </details> <p id="four" class="show"><b>FOUR</b> The top row is type="radio" and the bottom row is type="checkbox". Both types 6x of same name and 2 radio strangers - to see how it works.<br>Above right,a small anchor to the initial view</p> <p id="five" class="show"><b>FIVE</b> Checkbox onclick changes the state of checked / unchecked,but js just jumps and points to a new :target with each click</p> <p id="six" class="show"><b>SIX</b> ... </p> <div id="last"> <input type="checkbox" id="b1" name="box" value="1" onclick="jump('one')"><label for="b1">one</label> <input type="checkbox" id="b2" name="box" value="2" onclick="jump('two')"><label for="b2">two</label> <input type="checkbox" id="b3" name="box" value="3" onclick="jump('three')"><label for="b3">three</label> <input type="checkbox" id="b4" name="box" value="4" onclick="jump('four')"><label for="b4">four</label> <input type="checkbox" id="b5" name="box" value="5" onclick="jump('five')"><label for="b5">five</label> <input type="checkbox" id="b6" name="box" value="6" onclick="jump('six')"><label for="b6">six</label> </div>的是几个不同的参数,这些参数不是用换行符分隔,通过回声以空格分隔。

您可能想要编写此代码(请注意echo周围的引号:

$PRIVATE_KEY

通常,除非您确定要外壳扩展它们,否则在所有变量使用双引号时都是一个好习惯。

当然,所有这一切仅在使用POSIX shell时适用,这意味着您需要在Windows上使用Unix或- 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 }} ,因为您使用的语法是POSIX shell语法。

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...