Post navigation

Convert Certificate Formats

All of the certificates that we have been working with have been X.509 certificates that are ASCII PEM encoded. There are a variety of other certificate encoding and container types; some applications prefer certain formats over others. Also, many of these formats can contain multiple items, such as a private key, certificate, and CA certificate, in a single file.

OpenSSL can be used to convert certificates to and from a large variety of these formats. This section will cover a some of the possible conversions.

Convert PEM to DER

Use this command if you want to convert a PEM-encoded certificate () to a DER-encoded certificate (), a binary format:

The DER format is typically used with Java.

Convert PEM to PKCS7

Use this command if you want to add PEM certificates ( and ) to a PKCS7 file ():

Note that you can use one or more options to specify which certificates to add to the PKCS7 file.

PKCS7 files, also known as P7B, are typically used in Java Keystores and Microsoft IIS (Windows). They are ASCII files which can contain certificates and CA certificates.

Convert PKCS7 to PEM

Use this command if you want to convert a PKCS7 file () to a PEM file:

Note that if your PKCS7 file has multiple items in it (e.g. a certificate and a CA intermediate certificate), the PEM file that is created will contain all of the items in it.

Convert PEM to PKCS12

Use this command if you want to take a private key () and a certificate (), and combine them into a PKCS12 file ():

You will be prompted for export passwords, which you may leave blank. Note that you may add a chain of certificates to the PKCS12 file by concatenating the certificates together in a single PEM file () in this case.

PKCS12 files, also known as PFX files, are typically used for importing and exporting certificate chains in Microsoft IIS (Windows).

Convert PKCS12 to PEM

Use this command if you want to convert a PKCS12 file () and convert it to PEM format ():

Note that if your PKCS12 file has multiple items in it (e.g. a certificate and private key), the PEM file that is created will contain all of the items in it.

Как получить такой сертификат?

Вариантов и инструкций в Интернете достаточно много. В том числе у нас на вики в статье «».

В следующих разделах — краткие инструкции по самым популярным сервисам:

Lets’ Encrypt и certbot

Потребуется установить программу certbot. Под *nix- системами это сделать проще, но под Windows тоже не потребуется сверхъестественных усилий.

Инструкции могут сильно отличаться от версии операционной системы, одной страницей тут не обойтись, лучше подобрать подходящий для вашей среды вариант в Интернете. 
Да и задача этой инструкции в другом: дать общее представление о полных цепочках и объяснить, что делать со сгенерированными файлами, чтобы их получить. 

Предположим, что certbot у вас установлен. Что дальше? Запускаем несколько консольных команд.

Зарегистрироваться:

certbot register -m emailадминистратора@вашдомен.com

Сгенерировать сертификат:

certbot certonly --webroot -w /var/www/папкасервера -d вашдомен.com -d www.вашдомен.com

Если опасаетесь, что что-то не так и хотите сначала потренироваться, добавьте опцию —dry-run (режим эмуляции для отладки ошибок)

certbot certonly --dry-run --webroot -w /var/www/папкасервера -d вашдомен.com -d www.вашдомен.com

После успешной генерации сертификата у вас появятся 4 файла (их расположение также сильно зависит от вашей операционной системы):

  1. cert.pem (конечный сертификат),
  2. chain.pem (цепочка доверия от корневого сертификата, не включающая конечный),
  3. fullchain.pem (нужная нам полная цепочка, включая конечный сертификат, по сути это сложение cert.pem + chain.pem),
  4. privkey.pem (ваш приватный ключ, который никому нельзя ни показывать, ни отсылать).

Для веб-сервера необходимы два из них: fullchain.pem и privkey.pem.

Ещё несколько полезных команд certbot

Проверка и обновление сертификатов (полезно поставить запуск этой команды по расписанию):

certbot -q renew

Для проверки и обновления также есть тестовый режим (чтобы убедиться. что ваши домены будут обновляться):

certbot renew --dry-run

Добавление новых доменов и поддоменов к сертификату:

certbot certonly --webroot -w /var/www/папкасервера --expand -d вашдомен.com -d test.вашдомен.com -d www.вашдомен.ru

Изменение адреса администратора:

certbot register --update-registration -m newemail@вашдомен.ru

SSL For Free

Получить сертификат через онлайн-сервис намного быстрее и проще, ничего устанавливать не нужно:

  1. Выбор настроек (обычно ничего трогать не нужно, просто жмите «Next Step»)
  2. Подтверждение прав на домен, для которого получаете сертификат, любым из способов:
    • на почту его владельца (список готовый, посторонний адрес вписать не получится) — вам должен быть доступен один из перечисленных email.
    • изменением полей DNS (CNAME) — для новичков этот способ самый запутанный, но не требует доступности почты и http.
    • скачиванием подтверждающего файла и размещением его в подпапке сайта — к домену должен быть http-доступ из Интернета в момент проверки.
  3. После подтверждения останется выбрать формат: предлагается список шаблонов (Default, Tomcat, AWS, cPanel, Google App, Heroku. nginx, Plesk, итд) — но во всех случаях, кажется, скачивается идентичный архив.

Сертификат готов, но… сервис SSL For Free создаёт три файла:

  • ca_bundle.crt (цепочка, исключая конечный сертификат)
  • certificate.crt (сам конечный сертификат)
  • private.key (ваш приватный ключ, который никому нельзя ни показывать, ни отсылать).

Поэтому fullchain мы склеим вручную из двух первых файлов (сначала certificate.crt, затем ca_bundle.crt), и назовём его fullchain.crt (имена на самом деле могут быть любыми, но принято — и нужно — использовать «говорящие» названия: fullchain.crt/fullchain.pem, или domain.ca-bundle)

Сделать это можно как консольными командами, так и в обычном Блокноте Windows. Пример консольной команды:

cat domain.crt Intermediate1.crt Intermediate2.crt <все промежуточные что есть через пробел> CARoot.crt > fullchain.crt

(предполагается, что «domain.crt» — конечный сертификат домена, затем по восходящей перечислены все промежуточные файлы — их может быть один или несколько — и в самом конце корневой сертификат).

Серверу отдаём, соответственно, fullchain.crt и private.key.

Немного паранойи

Не забывайте, что онлайн-способы генерации не должны применяться для чувствительных данных! 
 Ведь если ваш приватный ключ создан сторонним сервисом, ему известен ваш приватный ключ! А значит, теоретически он уже попал в чужие руки. В этом случае стоит всё же приложить чуть больше усилий и сгенерировать все сертификаты и ключ локально. 

Misc

The traditional way to look at certificates is to “Run mmc”.

However you can also use PowerShell and do e.g.:

PS C:\Windows\system32> dir cert:Location   : CurrentUserStoreNames : {TrustedPublisher, ClientAuthIssuer, Root, UserDS...}Location   : LocalMachineStoreNames : {TestSignRoot, ClientAuthIssuer, Remote Desktop, Root...}

or e.g.:

PS C:\Windows\system32> dir Cert:\LocalMachine\myPSParentPath: Microsoft.PowerShell.Security\Certificate::LocalMachine\myThumbprint                                Subject----------                                -------A0EE...235E7E34  CN=comp1.company.net.nz6D30...3C743CCE  CN=localhost

All good!

Генерирование SSL-сертификата

Если вы хотите защитить свой сервис, но не хотите подписывать его в ЦС, вы можете создать и подписать сертификат самостоятельно.

Такие сертификаты называются самоподписанными.

По сути, самоподписанный сертификат – это сертификат, подписанный своим собственным закрытым ключом. Такие сертификаты тоже шифруют соединения, однако они не подтверждают подлинности сайта, потому пользователи, которые открывают сайт, увидят предупреждение.

Если вам ненужно подтверждать подлинность сайта, вы можете спокойно использовать самоподписанные сертификаты.

Генерирование самоподписанного сертификата

Этот метод позволяет защитить веб-сервер Apache или Nginx с помощью HTTPS.

Следующая команда создаст 2048-битный закрытый ключ (domain.key) и CSR (domain.csr):

Заполните запрос на подпись.

Опция -x509 создаёт самоподписанный сертификат. Опция -days 365 задаёт срок действия сертификата в днях.

Создание сертификата для существующего закрытого ключа

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

Следующая команда создаст сертификат (domain.csr) для существующего ключа (domain.key):

Ответьте на запросы программы, чтобы продолжить.

  • Опция -x509 создаёт самоподписанный сертификат. Опция -days 365 задаёт срок действия сертификата в днях.
  • Опция –new запускает запрос данных для создания CSR.

Генерирование запроса для существующего сертификата и ключа

Этот метод позволяет создать сертификат, если у вас уже есть закрытый ключ и запрос на подпись сертификата.

Следующая команда создаст сертификат (domain.crt) на основе существующего запроса (domain.csr) и закрытого ключа (domain.key):

Опция -days 365 задаёт срок действия сертификата в днях.

Создание самоподписанного корневого сертификата

openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.crt

Здесь мы использовали наш корневой ключ для создания корневого сертификата (файл rootCA.crt), который должен распространяться на всех компьютерах, которые нам доверяют. А приватный ключ (файл rootCA.key) должен быть секретным, поскольку он будет использоваться для подписи сертификатов серверов.

Создание сертификатов (делается для каждого домена) включает в себя несколько этапов. Эту процедуру необходимо выполнить для каждого домена/сервера, которым требуется доверенный сертификат от нашего ЦС.

Generating CSRs

This section covers OpenSSL commands that are related to generating CSRs (and private keys, if they do not already exist). CSRs can be used to request SSL certificates from a certificate authority.

Keep in mind that you may add the CSR information non-interactively with the option, mentioned in the previous section.

Generate a Private Key and a CSR

Use this method if you want to use HTTPS (HTTP over TLS) to secure your Apache HTTP or Nginx web server, and you want to use a Certificate Authority (CA) to issue the SSL certificate. The CSR that is generated can be sent to a CA to request the issuance of a CA-signed SSL certificate. If your CA supports SHA-2, add the option to sign the CSR with SHA-2.

This command creates a 2048-bit private key () and a CSR () from scratch:

Answer the CSR information prompt to complete the process.

The option specifies that the key should be 2048-bit, generated using the RSA algorithm. The option specifies that the private key should not be encrypted with a pass phrase. The option, which is not included here but implied, indicates that a CSR is being generated.

Generate a CSR from an Existing Private Key

Use this method if you already have a private key that you would like to use to request a certificate from a CA.

This command creates a new CSR () based on an existing private key ():

Answer the CSR information prompt to complete the process.

The option specifies an existing private key () that will be used to generate a new CSR. The option indicates that a CSR is being generated.

Generate a CSR from an Existing Certificate and Private Key

Use this method if you want to renew an existing certificate but you or your CA do not have the original CSR for some reason. It basically saves you the trouble of re-entering the CSR information, as it extracts that information from the existing certificate.

This command creates a new CSR () based on an existing certificate () and private key ():

The option specifies that you are using an X509 certificate to make a CSR.

From PKCS#12 to PEM

If you need to “extract” a PEM certificate (.pem, .cer or .crt) and/or its private key (.key)from a single PKCS#12 file (.p12 or .pfx), you need to issue two commands.

The first one is to extract the certificate:

Shell

> openssl pkcs12 -in certificate.pfx -nokey -out certificate.crt

1 >openssl pkcs12-incertificate.pfx-nokey-out certificate.crt

And a second one would be to retrieve the private key:

Shell

> openssl pkcs12 -in certificate.pfx -out privatekey.key

1 >openssl pkcs12-incertificate.pfx-out privatekey.key

IMPORTANT: the private key obtained with the above command will be in encrypted format: to convert it in RSA format, you’ll need to input a third command:

Shell

> openssl rsa -in privatekey.key -out privatekey_rsa.key

1 >openssl rsa-inprivatekey.key-out privatekey_rsa.key

Needless to say, since PKCS#12 is a password-protected format, in order to execute all the above commands you’ll be prompted for the password that has been used when creating the .pfx file.

Просмотр информации PKCS # 12 на экране

Чтобы вывести всю информацию из файла PKCS # 12 на экран в Формат PEM, используйте эту команду:

openssl pkcs12 -info -in INFILE.p12 -nodes

Затем вам будет предложено ввести пароль файла PKCS # 12:

Введите пароль для импорта:

Введите пароль, введенный при создании файла PKCS # 12, и нажмите . OpenSSL выведет на экран все сертификаты и закрытые ключи из файла:

Атрибуты пакета localKeyID: AC 3E 77 9A 99 62 84 3D 77 CB 44 0D F9 78 57 7C 08 28 05 97 subject = / CN = Aaron Russell/emailAddress=*********@gmail.com эмитент = / C = US / ST = Texas / L = Houston / O = SSL Corp / CN = SSL.com Client Certificate Intermediate CA RSA R1 ----- BEGIN CERTIFICATE ----- MIIF1DCCA7ygAwIBAgIQcOrAJCMayJsZBKJsyz / aQDANBgkqhkiG9w0BAQsFADB + MQswCQYDVQQGEwJVUzEOMAwGA1UECAwFVGV4YXMxEDAOBgNVBAcMB0hvdXN0b24x ETAPBgNVBAoMCFNTTCBDb3JwMTowOAYDVQQDDDFTU0wuY29tIENsaWVudCBDZXJ0 ... bwK6ABAZUq6QcvhD0LYsXya + ncDCR6wxb9E0DWd4ATQMzxGTu / yE3kT + 9Ef6IY + n armh3HZUfan2Hb64YD0tjLMca / PC + sKAZu28gB / 3HQRHIFugvh6RO3bIoorl0jUg biMl1r2 -----

Зашифровать закрытый ключ

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

openssl pkcs12 -info -in INFILE.p12

В этом случае вам будет предложено ввести и проверить новый пароль после того, как OpenSSL выдаст какие-либо сертификаты, а закрытый ключ будет зашифрован (обратите внимание, что текст ключа начинается с ):

Введите PEM фразу: контролирующая - Enter PEM фразу: ----- BEGIN зашифрованного Частного KEY ----- MIIFDjBABgkqhkiG9w0BBQ0wMzAbBgkqhkiG9w0BBQwwDgQIGwhJIMXRiLQCAggA MBQGCCqGSIb3DQMHBAiXdeymTYuedgSCBMjwGg78PsqiNJLfpDFbMxL98u3tK9Cs ... SGVCCBj5vBpSbBXAGbOv74h4satKmAMgGc8SgU06geS9gFgt / wLwehMJ / H4BSmex 4S / 2tYzZrDBJkfH9JpggubYRTgwfAGY2BkX03dK2sqfu + QVTVTKMj2VI0sKcFfLZ BDW = ----- END зашифрованы ЧАСТНЫЙ КЛЮЧ -----

Извлечь только сертификаты или закрытый ключ

Если вы хотите вывести только закрытый ключ, добавьте в команду:

openssl pkcs12 -info -in INFILE.p12 -nodes -nocerts

Если вам нужны только сертификаты, используйте (и поскольку нас не интересует закрытый ключ, мы также можем спокойно опустить ):

openssl pkcs12 -info -in INFILE.p12 -nokeys

Создание корневого приватного ключа

Внимание: этот ключ используется для подписи запросов сертификатов, любой, кто получил этот ключ, может подписывать сертификаты от вашего имени, поэтому храните его в безопасном месте:

Генерация приватного ключа RSA используя параметры по умолчанию (ключ будет сохранён в файл с именем rootCA.key):

openssl genpkey -algorithm RSA -out rootCA.key

Опция -out указывает на имя файла для сохранения, без этой опции файл будет выведен в стандартный вывод (на экран). Имя выходного файла не должно совпадать с именем входного файла.

Для безопасности ключа его следует защитить паролем. Генерация приватного ключа RSA используя 128-битное AES шифрование (-aes-128-cbc) и парольную фразу «hello» (-pass pass:hello):

openssl genpkey -algorithm RSA -out rootCA.key -aes-128-cbc -pass pass:hello

Конечно, опцию -pass pass:hello можно не указывать, тогда вам будет предложено ввести пароль во время генерации ключа.

Список поддерживаемых симметричных алгоритмов шифрования приватного ключа можно узнать в документации (раздел SUPPORTED CIPHERS):

man enc

Если для генерируемого ключа не указано количество бит, то по умолчанию используется 2048, вы можете указать другое количество бит с помощью команды вида (будет создан 4096-битный ключ):

openssl genpkey -algorithm RSA -out rootCA.key -aes-128-cbc -pkeyopt rsa_keygen_bits:4096

Объединить файлы.CRT, .KEY и.CA-BUNDLE

Для того, чтобы это сделать, установите на ваш компьютер программу openssl.exe .

Откройте данную утилиту и введите команду:

pkcs12 -export -out domain.name.pfx -inkey domain.name.key -in domain.name.crt -certfile domain.name.ca-bundle

domain.key — имя файла с приватным ключом RSA;

domain.crt — имя файла сертификата;

domain.ca-bundle — имя файла цепочки сертификатов.

Если конвертация прошла успешно, вы увидите слово Verifying.

Часто используемые форматы сертификатов: PEM
— очень часто используется в Linux based системах или оборудовании, файлы такого формата сертификата используют расширение.cer, .crt, and .pem. DER
— двоичная формат сертификата. DER формат не содержит текста «BEGIN CERTIFICATE/END CERTIFICATE», формат DER чаще всего использует расширение.der PKCS#7
или P7B
— эти форматы сертификата хранятся в формате Base64 ASCII и чаще всего имеют расширения файлов.p7b или.p7c. Файл P7B, кроме самого сертификата содержит цепочку сертификатов (открытых ключей) выпускающих центров сертификации (Intermediate CAs). Этот формат поддерживается в Windows и Java Tomcat. PKCS#12
или PFX
— эти форматы представляют собой двоичный формат для хранения сертификата сервера, промежуточных сертификатов и закрытого ключа в одном зашифрованном файле. Файлы такого формата сертификата используют расширение.pfx and .p12. PFX файлы обычно используются на windows машинах для импорта/экспорта сертификатов и закрытого ключа.

Конвертирование x509 в PEM

openssl x509 -in certificate.cer -outform PEM -out certificate.pem
Конвертирование
PEM в
DER

openssl x509 -outform der -in certificate.pem -out certificate.der
Конвертирование
DER в
PEM

openssl x509 -inform der -in certificate.der -out certificate.pem
Конвертирование
PEM в
P7B

openssl crl2pkcs7 -nocrl -certfile certificate.pem -out certificate.p7b -certfile CACert.cer
Конвертирование
PKCS7 в
PEM

openssl pkcs7 -print_certs -in certificate.p7b -out certificate.pem
Конвертирование
pfx в
PEM

openssl pkcs12 -in certificate.pfx -out certificate.pem
Конвертирование
PFX в
PKCS#8

Step 1:
Конвертирование
PFX в
PEM

openssl pkcs12 -in certificate.pfx -nocerts -nodes -out certificate.pem
Step 2:
Конвертирование
PEM в
PKCS8

openSSL pkcs8 -in certificate.pem -topk8 -nocrypt -out certificate.pk8
Конвертирование
P7B в
PFX

Для этого требуется выполнение двух команд

1. Конвертирование
P7B в
CER

openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
2. Конвертирование
CER и закрытого ключа в
PFX

openssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile cacert.cer

Я отвечаю за поддержку двух серверов Debian. Каждый раз, когда я должен что-либо делать с сертификатами безопасности, я Google для учебных пособий и отбиваю, пока он, наконец, не работает.

Однако в моих поисках я часто сталкиваюсь с разными форматами файлов (.key , .csr , .pem)), но я никогда не было в состоянии найти хорошее объяснение того, какова цель каждого файла.

Мне было интересно, могут ли хорошие люди здесь в ServerFault дать некоторые разъяснения по этому вопросу?

OpenSSL

Originally for the Linux world but you can get a Windows version from Shining Light. Don’t worry about the Win32 reference and the outdated documentation at the top. Scroll down and you’ll see the latest Win64 stuff.

And help with future work by donating $10 . It’s a lot easier than having to compile the binaries!

And there’s a free OpenSSL Cookbook.

openssl version -a

gives you the version.

openssl req -x509 -newkey rsa:4096 -sha256 -keyout openssl.key -out openssl.crt -subj “/CN=company.co.nz” -days 600

Generating a 4096 bit RSA private key…………………………………++…………………………++writing new private key to ‘opensll.key’Enter PEM pass phrase:Verifying — Enter PEM pass phrase:

The crt file is the same as a cer file. You can use it in Windows e.g. to load a signing key for another claims provider in ADFS.

But it doesn’t contain a private key — that’s in a separate file — and Windows doesn’t like that. See below for steps on combining them.

As far as multiple SAN are concerned, OpenSSL currently doesn’t support a way of doing this via the command line.

I believe this is coming in 1.1.1 via:

extension “subjectAltName = DNS:mycompany.co.nz, DNS:minecompany.co.nz”

At the moment, you need to do this via a configuration file.

— — — — — — — —

distinguished_name = req_distinguished_namex509_extensions = v3_reqprompt = noC = NZST = NIL = AucklandO = CompanyOU = DivisionCN = company.co.nzkeyUsage = critical, digitalSignature, keyAgreementextendedKeyUsage = serverAuthsubjectAltName = @alt_namesDNS.1 = company.co.nzDNS.2 = mycompany.comDNS.3 = minecompany.co.nz

— — — — — — — —

Save this as “san.cnf”.

openssl req -x509 -newkey rsa:4096 -sha256 -keyout opensll.key -out openssl.crt -days 600 -config san.cnf

To make this available to Windows, you need to combine the private and public keys into one pfx file.

openssl pkcs12 -export -name “company.co.nz” -out openssl.pfx -inkey openssl.key -in openssl.crt

where “company.co.nz” is the friendly name.

Закрытые ключи

Создание закрытого ключа

Чтобы создать закрытый 2048-битный ключ, защищённый паролем, введите:

По запросу введите пароль, чтобы продолжить.

Проверка закрытого ключа

Эта команда подтвердит валидность закрытого ключа:

Если ключ зашифрован, программа запросит парольную фразу. Предоставьте пароль от ключа, чтобы просмотреть его в незашифрованном формате.

Совпадение ключа с сертификатом и запросом

Эта команда позволяет узнать, относится ли закрытый ключ (domain.key) к тому или иному сертификату (domain.crt) и запросу (domain.csr):

Если команды вернули одинаковый вывод, то, скорее всего, этот ключ, запрос и сертификат связаны.

Шифрование закрытого ключа

Следующая команда возьмёт незашифрованный ключ (unencrypted.key) и зашифрует его (encrypted.key):

Введите пароль, чтобы зашифровать ключ.

КОНВЕРТАЦИЯ SSL СЕРТИФИКАТОВ В OPENSSL

Данные команды OpenSSL дают возможность преобразовать сертификаты и ключи в разные форматы. Для того чтобы сделать их совместимыми с определенными видами серверов, либо ПО. К примеру, Вам необходимо конвертировать обыкновенный файл PEM, который будет работать с Apache, в формат PFX (PKCS # 12) с целью применения его с Tomcat, либо IIS.

  • Конвертировать PEM в DER openssl x509 -outform der -in certificate.pem -out certificate.der
  • Конвертировать PEM в P7B openssl crl2pkcs7 -nocrl -certfile certificate.cer -out certificate.p7b -certfile CACert.cer
  • Конвертировать PEM в PFX openssl pkcs12 -export -out certificate.pfx -inkey privateKey.key -in certificate.crt -certfile CACert.crt
  • Конвертировать DER в PEM openssl x509 -inform der -in certificate.cer -out certificate.pem
  • Конвертировать P7B в PEM openssl pkcs7 -print_certs -in certificate.p7b -out certificate.cer
  • Конвертировать P7B в PFX openssl pkcs7 -print_certs -in certificate.p7b -out certificate.ceropenssl pkcs12 -export -in certificate.cer -inkey privateKey.key -out certificate.pfx -certfile CACert.cer
  • Конвертировать PFX в PEM openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes
Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Мой редактор ОС
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: