Примечание: это не совсем вопрос, потому что я уже нашел ответ, но так как я не нашел его здесь легко, я опубликую его, чтобы он мог принести пользу другим.
Вопрос: Как прочитать сцепленный PEM-файл как файл, используемый директивой apache / mod_ssl SSLCACertificateFile ?
Ответ (оригинал) ( источник ):
cat $file|awk 'split_after==1{n++;split_after=0} /-----END CERTIFICATE-----/ {split_after=1} {print > "cert" n ".pem"}'
Это может оставить пустой файл, если в конце есть пустая строка, например, с openssl pkcs7 -outform PEM -in my-chain-file -print_certs
. Чтобы предотвратить это, проверьте длину строки перед печатью:
cat $file|awk 'split_after==1{n++;split_after=0}
/-----END CERTIFICATE-----/ {split_after=1}
{if(length($0) > 0) print > "cert" n ".pem"}'
Ответ 29/03/2016 :
После @slugchewer ответа , csplit
может быть понятнее вариант с:
csplit -f cert- $file '/-----BEGIN CERTIFICATE-----/' '{*}'
openssl
, например , один сертификат для анализа.Ответы:
Фрагмент awk работает для извлечения различных частей, но вам все равно нужно знать, какой раздел является ключом / сертификатом / цепочкой. Мне нужно было извлечь конкретный раздел и найти его в списке рассылки OpenSSL: http://openssl.6102.n7.nabble.com/Convert-pem-to-crt-and-key-files-tp47681p47697.html
источник
Ранее на StackOverflow был дан ответ :
Изменить 29/03/2016 : см. Ответ @slugchewer
источник
Команда
split
доступна в большинстве систем, и ее вызов, вероятно, легче запомнить.Если у вас есть файл,
collection.pem
который вы хотите разбить наindividual-*
файлы, используйте:Если у вас нет
split
, вы можете попробоватьcsplit
:источник
-p
опцию (ни страницы, которые я читаю ) на split. Может быть, вы используете специальный бинарный файл / пакетcsplit
вместо этого ... (см.csplit
!csplit: *}: bad repetition count
(но похоже, что split работает)Если вы хотите получить один сертификат из пакета PEM с несколькими сертификатами, попробуйте:
openssl
команды обработают файл PEM и выплюнут его с префиксами"subject:"
и"issuer:"
строками перед каждым сертификатом. Если ваш PEM уже отформатирован таким образом, вам нужна только последняяawk
команда.источник1 , источник2
источник
Также стоит отметить, что PEM-файлы - это просто набор ключей / сертификатов внутри
BEGIN
/END
блоков, так что довольно просто вырезать / вставить, если это всего лишь один файл с одним или двумя интересными объектами ...источник
Если вы обрабатываете сертификаты с полной цепочкой (т. Е. Сгенерированные letsencrypt / certbot и т. Д.), Которые являются объединением сертификата и цепочки центра сертификации, вы можете использовать манипуляцию строк bash.
Например:
Чтобы извлечь сертификат и цепочку центра сертификации в переменные:
Объяснение:
Вместо использования awk или openssl (которые являются мощными инструментами, но не всегда доступны, например, в изображениях Docker Alpine), вы можете использовать манипуляции со строками bash.
"${FULLCHAIN%%-----END CERTIFICATE-----*}-----END CERTIFICATE-----"
: от конца содержимого FULLCHAIN, вернуть самое длинное совпадение подстроки, затем concat,-----END CERTIFICATE-----
когда оно будет удалено. Соответствует*
всем персонажам после-----END CERTIFICATE-----
.$(echo -e "${FULLCHAIN#*-----END CERTIFICATE-----}" | sed '/./,$!d')
: с начала содержимого FULLCHAIN, верните самое короткое совпадение подстроки, затем удалите начальные строки. Аналогично,*
соответствует всем персонажам раньше-----END CERTIFICATE-----
.Для быстрого ознакомления (хотя вы можете узнать больше о работе со строками в bash здесь ):
${VAR#substring}
= самая короткая подстрока от начала содержимого VAR${VAR%substring}
= самая короткая подстрока из конца содержимого VAR${VAR##substring}
= самая длинная подстрока от начала содержимого VAR${VAR%%substring}
= самая длинная подстрока из конца содержимого VARисточник
Хммм ... почти так же, как я подготовил решение (как предложено y @Cerber), не осознавая, что эта ситуация, похоже, есть у многих людей. Мое решение следует почти той же логике, но использует несколько более простых команд:
Все мои сертификаты находятся в файле:
certin.pem
Это, в основном, сохраняет запись в файл до тех пор, пока не встретит «END», а затем начнет запись в другой файл в увеличенном виде. Таким образом, у вас будет «N» количество файлов выходных файлов ( certout0.pem, certout1.pem и т. Д.) В зависимости от того, сколько сертификатов содержится во входном файле pem ( certin.pem ).
источник