Используйте openssl в действии github

#github #openssl #rsa #github-actions

#github #openssl #rsa #github-действия

Вопрос:

Я хочу опубликовать артефакт действия 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:cryptopempem_lib.c:745:Expecting: ANY PRIVATE KEY
  

Это означает, что все, что было передано в privatekey.pem — это не фактическое значение секретного ключа, а что-то другое. Я не смог распечатать содержимое файла в последующих тестах. Не с помощью команды necho или cat или чего-либо подобного, поэтому я фактически не знаю, что записано в файл, что не позволяет мне углубиться в мой анализ.

Кто-нибудь здесь может дать несколько полезных советов или предложить решение этой проблемы?

Ответ №1:

Вероятно, что часть вашей проблемы заключается в отсутствии кавычек. Когда вы не заключаете переменную в кавычки в shell, она разделяется пробелами (пробел, табуляция и перевод строки), поэтому вы передаете echo несколько разных аргументов, которые разделяются не символами новой строки, а пробелами через 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 }}
  

В общем, рекомендуется заключать все переменные в двойные кавычки при их использовании, если вы не уверены, что хотите, чтобы оболочка их расширяла.

Конечно, все это применимо только в том случае, если вы используете оболочку POSIX, что означает, что вам нужно использовать Unix или bash в Windows, поскольку используемый вами синтаксис является синтаксисом оболочки POSIX.

Действия GitHub, как и большинство систем CI, пытаются очистить свои выходные данные, чтобы предотвратить раскрытие секретов, которые случайно печатаются в журналах, из-за чего вы не смогли напечатать значение.

Комментарии:

1. Да, это было именно так. Однако важно было заметить, что я был на компьютере с Windows, который по умолчанию использует powershell для выполнения этих команд. Цитирование команды, как в вашем ответе, сработало должным образом только после того, как я указал shell: bash . Если бы вы могли добавить это в качестве примечания к своему ответу, это было бы очень полезно.