Как получить файл .pem из файлов .key и .crt?

Ответы:

801

Ваши ключи уже могут быть в формате PEM, но просто названы с помощью .crt или .key.

Если содержимое файла начинается с, -----BEGINи вы можете прочитать его в текстовом редакторе:

Файл использует base64, который читается в ASCII, а не в двоичном формате. Сертификат уже в формате PEM. Просто измените расширение на .pem.

Если файл в двоичном формате:

Для server.crt вы бы использовали

openssl x509 -inform DER -outform PEM -in server.crt -out server.crt.pem

Для server.key используйте openssl rsaвместо openssl x509.

Возможно, server.key - это ваш закрытый ключ, а файл .crt - это возвращенный подписанный сертификат x509.

Если это для веб-сервера, и вы не можете указать загрузку отдельного частного и открытого ключа:

Вам может понадобиться объединить два файла. Для этого используйте:

cat server.crt server.key > server.includesprivatekey.pem

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

maxwellb
источник
2
Проверьте формат server.key. Я только предполагал, что это был RSA. Но чтение первой строки файла, вероятно, скажет вам об этом.
maxwellb
10
Просто заголовок, cat server.crt server.key > server.pemкоторый не будет размещать открытый комментарий в своей строке, что кажется обязательным требованием. Курьерская почта доставила мне ад, и мне потребовались часы, чтобы понять, что происходит не так.
Грэм Уолтерс
1
Спасибо, Грэм. Различные инструменты будут генерировать файлы по-разному, и, в конечном счете, некоторая проверка хороша. Когда я выполнял эти шаги, файлы заканчивались символом новой строки, например.
maxwellb
Совет по объединению файлов .crt и .key вместе был очень полезен. Я хотел использовать свой сертификат с stunnel3, но у него не было способа указать файл ключа. Использование конкатенации сработало. (На самом деле, поскольку stunnel3 - это программа на Perl, я сам добавил к ней опцию для чтения файла ключа. Однако, поскольку позже я увидел, что конкатенация сработала, я вернул stunnel3 к его исходному коду.)
LS
2
Просто скажу, что cat server.crt server.key > server.includesprivatekey.pemполезен для SSL с haproxy 1.5.
jimm101
224

Мне нужно было сделать это для AWS ELB. После многократного избиения диалогом, вот что у меня получилось:

openssl rsa -in server.key -text > private.pem
openssl x509 -inform PEM -in server.crt > public.pem

Спасибо NCZ

Редактировать: как говорит @floatingrock

С AWS не забудьте добавить имя файла с помощью file://. Так это будет выглядеть так:

 aws iam upload-server-certificate --server-certificate-name blah --certificate-body file://path/to/server.crt --private-key file://path/to/private.key --path /cloudfront/static/

http://docs.aws.amazon.com/cli/latest/reference/iam/upload-server-certificate.html

SLF
источник
19
С AWS не забудьте добавить имя файла с помощью file://. Так это будет выглядеть так:aws iam upload-server-certificate --server-certificate-name blah --certificate-body file://~/Desktop/server.crt --private-key file://~/Desktop/private.key --path /cloudfront/static/
FloatingRock
1
Вторая команда ничего не делает, если ваш ввод является файлом pem, поэтому при условии, что это так, вам нужна только первая команда
Kristofer
Потрясающие! Это хорошо сработало для меня! Просто преобразовал мои .key и .crt файлы в .pem, используя ваши строки кода, а затем я загрузил (копировал / вставил) через консоль AWS. Спасибо!
Диего Д
79

pemФайл содержит сертификат и закрытый ключ. Это зависит от формата вашего сертификата / ключа, но, вероятно, это так просто:

cat server.crt server.key > server.pem
STH
источник
я продолжаю получать-bash: server.key.pem: Permission denied
tq
2
@tq: Это означает, что вам запрещено читать или писать этот файл.
STH
спасибо @sth поищу разрешение. но я делал это с помощью команд sudo
tq
8
@tq: cat server.crt server.key | sudo tee server.pem
Димир
2
следите за пропущенными символами новой строки, в нашем файле pem могут быть искаженные строки, например ----- КОНЕЦ СЕРТИФИКАТА ---------- НАЧАТЬ СЕРТИФИКАТ -----
Wolfgang Fahl
24

Кроме того, если вы не хотите, чтобы он запрашивал фразу-пароль, необходимо выполнить следующую команду:

openssl rsa -in server.key -out server.key
Рахул
источник
9
Если вы хотите, чтобы файл начинался с, -----BEGIN RSA PRIVATE KEY-----и у вас есть файл, начинающийся с -----BEGIN ENCRYPTED PRIVATE KEY-----, это команда, которую вы хотите использовать.
Филипп Гербер
18

это лучший вариант для создания файла .pem

openssl pkcs12 -in MyPushApp.p12 -out MyPushApp.pem -nodes -clcerts
GOrozco58
источник
4

Я заметил следующее: если вы используете openssl для генерации сертификатов, он захватывает как текстовую часть, так и часть сертификата base64 в файле crt. Строгий формат pem говорит ( определение вики ), что файл должен начинаться и заканчиваться BEGIN и END.

.pem - (Privacy Enhanced Mail) сертификат DER в кодировке Base64, заключенный между "----- BEGIN CERTIFICATE -----" и "----- END CERTIFICATE -----"

Таким образом, для некоторых библиотек (я сталкивался с этим в Java), которые ожидают строгого формата pem, сгенерированный crt не пройдет проверку как «неверный формат pem».

Даже если вы копируете или выполняете grep строки с помощью BEGIN / END CERTIFICATE и вставляете их в файл cert.pem, это должно работать.

Вот что я делаю, не очень чисто, но у меня работает, в основном фильтрует текст, начиная со строки BEGIN:

grep -A 1000 BEGIN cert.crt> cert.pem

adityalad
источник
1
Другой вариант - просто пропустить не строгий сертификат openssl x509. Он выдаст действительный сертификат PEM: cat certificate.crt | openssl x509 > certificate.pem
T0xicCode
Если вы хотите получить все от «НАЧАЛА» до конца файла, это работа для sed. В частности, вы хотите что-то подобное sed -n '/--BEGIN/,$p' cert.crtв этом случае. Чтобы объяснить это: «-n» говорит sed не печатать ничего по умолчанию, а затем выражение диапазона /--BEGIN/,$применяет pкоманду (print) к строкам между первой строкой, которая содержит, --BEGINи концом file ( $).
dannysauer
4

Я пытался перейти от Godaddy к App Engine. Что сделал трюк, используя эту строку:

openssl req -new -newkey rsa:2048 -nodes -keyout name.unencrypted.priv.key -out name.csr

Точно так же, как есть, но замена имени на мое доменное имя (не то, чтобы оно действительно даже имело значение)

И я ответил на все вопросы, касающиеся общего названия / организации, как www.name.com

Затем я открыл csr, скопировал его, вставил его в go daddy, затем загрузил его, разархивировал, перешел в разархивированную папку с терминалом и ввел:

cat otherfilegodaddygivesyou.crt gd_bundle-g2-g1.crt > name.crt

Затем я использовал следующие инструкции по устранению неполадок с SSL для пользовательского домена Служб Google :

openssl rsa -in privateKey.key -text > private.pem
openssl x509 -inform PEM -in www_mydomain_com.crt > public.pem

в точности как есть, за исключением того, что вместо privateKey.key я использовал name.unencrypted.priv.key, а вместо www_mydomain_com.crt я использовал name.crt

Затем я загрузил public.pem в консоль администратора для «сертификата X.509 в кодировке PEM» и загрузил private.pem для «секретного ключа RSA в кодировке PEM в незашифрованном виде».

.. И это, наконец, сработало.

Сообщество
источник
4

Пытаясь загрузить сертификат GoDaddy в AWS, я несколько раз терпел неудачу, но в итоге все оказалось довольно просто. Не нужно ничего конвертировать в .pem. Нужно просто включить сертификат пакета GoDaddy в параметр цепочки, например

aws iam upload-server-certificate
    --server-certificate-name mycert
    --certificate-body file://try2/40271b1b25236fd1.crt
    --private-key file://server.key
    --path /cloudfront/production/
    --certificate-chain file://try2/gdig2_bundle.crt

И чтобы удалить предыдущую неудачную загрузку вы можете сделать

aws iam delete-server-certificate --server-certificate-name mypreviouscert
skensell
источник
Это не сработало для меняAn error occurred (MalformedCertificate) when calling the UploadServerCertificate operation: Unable to parse certificate. Please ensure the certificate is in PEM format.
Адам Раудонис
4
  1. Скачать сертификат с временного портала по appleId,
  2. Экспорт сертификата из цепочки ключей и имя (Certificates.p12),
  3. Откройте терминал и перейдите в папку, в которой вы сохраняете файл Certificates.p12,
  4. Запустите следующие команды:

    а) openssl pkcs12 -in Certificates.p12 -out CertificateName.pem -nodes,

    б) openssl pkcs12 -in Certificates.p12 -out pushcert.pem -nodes -clcerts

  5. Ваш файл .pem готов "pushcert.pem".
Ашвин Аджадия
источник
0
  • Откройте терминал.
  • Перейдите в папку, где находится ваш сертификат.
  • Выполните приведенную ниже команду, заменив имя своим сертификатом.

openssl pkcs12 - в YOUR_CERTIFICATE.p12 - в YOUR_CERTIFICATE.pem -nodes -clcerts

  • Надеюсь, это сработает!
Давал Х. Нена
источник