Одно из наших приложений github-backup требует использования закрытого ключа RSA в качестве переменной среды.
Просто пытаюсь экспортировать ключ в терминал, например:
text
export PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA04up8hoqzS1+
...
l48DlnUtMdMrWvBlRFPzU+hU9wDhb3F0CATQdvYo2mhzyUs8B1ZSQz2Vy==
-----END RSA PRIVATE KEY-----
Не работает ... из-за разрывов строк.
Я немного погуглил, но не нашел работоспособного решения ...
например: Как установить переменную среды многострочного закрытого ключа RSA для AWS Elastic Beans

Ошибка:
-----END RSA PRIVATE KEY-----': not a valid identifier
следовал инструкциям в: http://blog.vawter.com/2016/02/10/Create-an-Environment-Variable-from-a-Private-Key
Создал файл keytoenvar.sh со следующими строками:
#!/usr/bin/env bash
file=$2
name=$1
export $name = "$(awk 'BEGIN{}{out=out$0"\n"}END{print out}' $file| sed 's/\n$//')"
затем выполнил следующую команду:
source keytoenvar.sh PRIVATE_KEY ./gitbu.2018-03-23.private-key.pem
Это работает, но похоже на подход "многословный" ... ?
Кто-нибудь знает способ сделать это проще?
(Я надеюсь на решение "дружелюбный к новичкам" без лишних "шагов" ...)
@MarkHu Ваш подход не работает.
Если я не неправильно понимаю, на что смотрю, вы опубликовали закрытый ключ на Stack Overflow, чтобы его мог увидеть весь мир. Прошел год, но если этот ключ все еще активен, вы должны его изменить.
@ rp.beltran длина ключа недостаточна для того, чтобы быть действующим закрытым ключом RSA. но спасибо за вашу заботу. :-)
Хороший момент, мой плохой





экспортировать ключ
export PRIVATE_KEY=`cat ./gitbu.2018-03-23.private-key.pem`
test.sh
#!/bin/bash
echo "$PRIVATE_KEY";
Если вы хотите сохранить ключ в файле .env с остальными переменными среды, все, что вам нужно сделать, это «обернуть» строку закрытого ключа в одинарные кавычки в файле .env ... например: sh exports HELLO_WORLD='-----BEGIN RSA PRIVATE KEY----- MIIEpAIBAAKCAQEA04up8hoqzS1+APIB0RhjXyObwHQnOzhAk5Bd7mhkSbPkyhP1 ... iWlX9HNavcydATJc1f0DpzF0u4zY8PY24RVoW8vk+bJANPp1o2IAkeajCaF3w9nf q/SyqAWVmvwYuIhDiHDaV2A== -----END RSA PRIVATE KEY-----'
Итак, следующая команда будет работать:
echo "export PRIVATE_KEY='`cat ./gitbu.2018-03-23.private-key.pem`'" >> .env
С последующим:
source .env
Теперь ключ будет в вашем файле .env, и всякий раз, когда вы будете исходить из .env, он будет экспортирован.
Как отмечено в этом ответе, stackoverflow.com/a/53271334/292408, echo $PRIVATE_KEY иногда удаляет все символы новой строки при отображении вывода. Я думаю, это зависит от оболочки, возможно, от версии или от эха. Но пример был бы лучше и точнее, если бы он был заключен в двойные кавычки.
Также следует отметить, что я только что понял, env всегда показывает переменные правильно, с новой строкой.
когда я пытаюсь получить доступ к своему ключу из файла .env, он возвращает только первую строку '----- BEGIN RSA PRIVATE KEY -----'
В этом случае я получаю только последнюю строку ключевого файла
Я использую файл .env с проектом в Glitch, и заключение ключа в одинарные кавычки было единственным решением, которое сработало для меня ... Я искал некоторое время, так что спасибо !!
ПРИМЕЧАНИЕ: Чтобы вывод работал правильно, мне пришлось заключить переменную окружения в двойные кавычки. В противном случае он заменял новые строки пробелами.
В:
export PRIVATE_KEY=$(cat ./gitbu.2018-03-23.private-key.pem)
Вне:
echo "$PRIVATE_KEY"
ПРОКЛЯТИЕ!!! Это здорово, я продолжал проверять переменную без кавычек и получал 1 строку (echo $TEST | wc --lines). И сходил с ума !!! Спасибо, что предложили это, очень помогло определить, действительно ли в нем есть все линии.
Также следует отметить, что я только что понял, env всегда показывает переменные правильно, с новой строкой.
Если вы хотите экспортировать прямое значение (не из * .pem), используйте " после знака равенства. Терминал позволит вам закончить с другим ".
export PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA04up8hoqzS1+
...
l48DlnUtMdMrWvBlRFPzU+hU9wDhb3F0CATQdvYo2mhzyUs8B1ZSQz2Vy==
-----END RSA PRIVATE KEY-----"
Я хотел только один исполняемый сценарий оболочки, содержащий все это, а не 1 сценарий и 1 файл .pem, а затем выполнять некоторую гимнастику между ними, как то, что я вижу в существующих ответах.
Все, что необходимо для достижения этой унификации, - это следующее. Подготовительный этап:
cat id_rsa | base64 -w0
# assign the converted 1-liner string wrap in single quote into a shell variable, for example
pk='xxxxxxxxxxxyyyyyyyyyyzzzzzzzzzzz......'
Остальное - прогулка по парку. Для ssh с использованием переменной pk вы преобразуете однострочную строку обратно в ее исходное положение и запишите во временный файл.
t=$(mktemp)
printf $pk | base64 --decode > $t
ssh -i $t [email protected]
Для очистки используйте trap:
trap cleanup 1 2 3 6
cleanup () {
rm -f $t
}
Для повышения безопасности измените mktemp так, чтобы писать где-нибудь в папке $HOME, где только вы можете читать, а не в /tmp, где другие пользователи того же сервера могут читать.
кодировка ключа base64 также оказалась для меня лучшим решением
Вы также можете использовать bash heredoc:
export MY_CERTIFICATE=$(cat <<EOF
-----BEGIN CERTIFICATE-----
qiuwiuwoejqododhIOOISOIIOiiSNIDNIDINDIONDIND
DDHDHUDHDUHUhudhHQhhqoohooiiohihiohihhihhihi
dhdiodhioho...
-----END CERTIFICATE-----
EOF
)
После того, как вы его установите, вы можете получить к нему доступ как к обычной переменной env echo "$MY_CERTIFICATE".
Я пробовал это, но сертификат в одну строку, разрыва строки нет.
@max johnson: это справедливо, потому что апострофы отсутствуют. Попробуйте echo "$MY_CERTIFICATE". Это должно сработать.
Простое и лучшее решение!
Добавление ключа RSA в файл .env.
Шаг 1.
echo "PRIVATE_KEY=\"`sed -E 's/$/\\\n/g' my_rsa_2048_priv.pem`\"" >> .env
Ваш ключ в файле .env будет выглядеть примерно так:
PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n
dasdasdadasdasdasdasdasdasdasdadasdasdadasa\n
huehuauhhuauhahuauhauahuauhehuehuauheuhahue\n
-----END RSA PRIVATE KEY-----\n"
Шаг 2. При печати PRIVATE_KEY отображается только первая строка.
Измените переменную на одну строку. Как это:
PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\ndasdasdadasdasdasdasdasdasdasdadasdasdadasa\nhuehuauhhuauhahuauhauahuauhehuehuauheuhahue\n-----END RSA PRIVATE KEY-----\n"
Если вы используете ключ внутри приложения
например узел.process.env.PRIVATE_KEY будет выводиться правильно.
Я добавлю, что более элегантный надежный способ - это закодировать env var как base64, а затем декодировать его при доступе к нему.
const base64 = process.env.GITHUB_PRIVATE_KEY
const privateKey = Buffer.from(base64, 'base64')
У вашего сценария .sh возникла проблема: вы пытались использовать
export $var(по ссылке / значению), но вместо этого должны былиexport var(по имени). В любом случае, ответ прост:bashдопускает использование многострочных строковых литералов, если они заключены в кавычки. Используйте одинарные или двойные кавычки.