- Создание самоподписанного сертификата в OpenSSL для подписывания документов
- Связь сертификата с закрытым ключом
- Создание сертификата OpenSSL
- Что такое сертификаты?
- Создание закрытого ключа и запроса на подпись
- Подпись сертификатов OpenSSL
- Просмотр сертификатов
- Выводы
- Создаём самоподписанный ssl сертификат с помощью OpenSSL.
- Создаём самоподписанный ssl сертификат с помощью OpenSSL.
- Убираем пароль с секретного ключа.
Создание самоподписанного сертификата в OpenSSL для подписывания документов
- Найти, скачать и установить подходящий OpenSSL, начинать искать можно отсюда.
- Если при старте OpenSSL в консоли есть ошибка «Can’t open config file /usr/local/ssl/openssl.cnf» необходимо создать системную переменную, например в cmd.exe так: set OPENSSL_CONF=C:\OpenSSL-Win32\bin\openssl.cfg.
- Подменить дефолтный openssl.cnf на приложенный openssl.cfg.
- Выполнить в консоли OpenSSL команду: req -x509 -new -out server.crt -days 365
Ключевым местом для возможности подписывания документов в этом конфиге является строчка keyUsage = digitalSignature.
Связь сертификата с закрытым ключом
Необходимость связать сертификат с закрытым ключом возникает, например, при появлении сообщении об ошибке Cannot find the certificate and private key for decryption. (0x8009200B) в частности в браузерном плагине Crypto-Pro.
Цепочка создания закрытого ключа, запроса на подпись сертификата, сертификата и .p12-файла будет такой:
Для начала надо убедиться, что в openssl.cfg, в секции [ req ] добавлена строка req_extensions = v3_req, а в секции [ v3_req ] есть нужное нам расширение keyUsage = digitalSignature.
#Создание приватного ключа
openssl genrsa -des3 -out test.key 2048
#Удаление фразы пароля — опционально
openssl rsa -in test.key -out test.nopass.key
#Создание запроса на подпись сертификата для нашего ключа
openssl req -new -key test.nopass.key -out test.csr -config openssl.cfg
#Проверка подключения нужных расширений в запрос, в частности keyUsage = digitalSignature
openssl req -text -noout -in test.csr
#Генерация самоподписанного сертификата
openssl x509 -req -days 3650 -in test.csr -signkey test.nopass.key -out test.crt -extensions v3_req -extfile openssl.cfg
#Получение p12
openssl pkcs12 -export -in test.crt -inkey test.nopass.key -out test.p12
Ну и бонусная картинка, чтобы не ходить лишний раз в википедию за ответом на вопрос «что-такое OpenSSL» если вдруг позабылось:
Создание сертификата OpenSSL
В наши дни очень часто для повышения безопасности сетевых соединений или просто для аутентификации используются ssl сертификаты. Одна из самых популярных свободных программ для создания сертификатов — это OpenSSL. Это утилита командной строки, которая позволяет создавать различные виды сертификатов, например, PKI или HTTPS.
В этой статье мы рассмотрим что такое сертификаты, какими они бывают, разберем подробно создание сертификата OpenSSL. Причем рассмотрим каждый этап, чтобы вам было легче понять что и как происходит.
Что такое сертификаты?
Думаю нужно начать с самого начала. Сертификаты в первую очередь позволяют идентифицировать человека, подтвердить что вы тот, за кого себя выдаете. А работает это так — есть два ключа — закрытый и открытый. Зашифровать сообщение можно с помощью открытого ключа, но чтобы его расшифровать нужен только закрытый ключ. Если у вас нет закрытого ключа, то вы попросту не сможете расшифровать зашифрованное сообщение. Фактически зашифровать сообщение может каждый, но расшифровать его способен только владелец закрытого (секретного ключа).
Если вы смогли расшифровать отправленное сообщение, зашифрованное с помощью вашего открытого ключа, то значит — это вы. Ключи работают только в паре, и вы не сможете расшифровать ничего другим ключом. Но еще остался один момент. Как определить что этот открытый ключ именно ваш, например, принадлежит вашему домену? Все просто, достаточно, чтобы кто-то из авторитетных источников, например, Comodo или LetsEncrypt подписал ваш ключ. Это так называемые центры сертификации.
В этой инструкции мы будем иметь дело с такими видами ключей:
- .pem, .crt, .cer — готовый, подписанный центром сертификации сертификат, расширения разные, но означают одно и то же. Если совсем просто, то сертификат, это подписанный открытый ключ, плюс немного информации о вашей компании;
- .key — закрытый или открытый ключ;
- .csr — запрос на подпись сертификата, в этом файле хранится ваш открытый ключ плюс информация, о компании и домене, которую вы указали.
А теперь рассмотрим как создать сертификат openssl, как его подписать и что для этого нужно сделать. Генерация ключей openssl — это довольно простая задача, если во всем разобраться.
Создание закрытого ключа и запроса на подпись
Вам необязательно подписывать сертификаты в центре сертификации CA, вы можете подписать их сами, но об этом потом. Весь процесс вам так и так придется пройти. Сначала рассмотрим как создать закрытый ключ с нуля, и указать необходимую информацию. Это CN, где должно быть указанно ваше доменное имя, для которого вы собираетесь использовать сертификат, также можно указать дополнительную информацию о вашей компании, адресе и организации, но это уже необязательно.
Чтобы создать закрытый ключ и запрос на подпись открытого ключа выполните такую команду:
openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr
Опция -newkey указывает, что нужно создать новую пару ключей, а в параметрах мы сообщаем тип rsa и сложность 2048 байт. Опция -nodes указывает, что шифровать ключ не нужно, опция -new указывает что нужно создать запрос csr. Если у вас уже есть закрытый ключ, то вы можете создать для него csr запрос такой командой:
openssl req -key domain.key -new -out domain.csr
Во время создания вам нужно будет указать всю необходимую информацию для csr, это в первую очередь домен и организация. Можно создавать закрытый ключ отдельно:
openssl genrsa -des3 -out domain.key 2048
Кроме того, можно создать csr запрос из уже существующего сертификата и закрытого ключа, тогда вам не придется вводить информацию, она будет получена из сертификата:
openssl x509 -in domain.crt -signkey domain.key -x509toreq -out domain.csr
Параметр -x509toreq указывает, что нужно использовать сертификат для X509 для получения CSR. X509, это сертификаты, подписанные сами собой. Обычно сертификат подписывается другим сертификатом, а этот был подписан сам собой. Если вы получили сертификат от CA, то этот параметр не нужен.
Подпись сертификатов OpenSSL
Допустим, у вас есть приватный ключ и запрос на подпись, фактически, открытый ключ. Теперь вам нужно его подписать чтобы получить сертификат, который можно использовать. Тут есть несколько вариантов. Можно отправить csr файл на подпись какому-либо центру сертификации, например, LetsEncrypt. Можно подписать сертификат тем же ключом, с помощью которого он был создан, и третий вариант — создать свой центр сертификации.
Первый способ я рассматривать не буду. Здесь все просто. Либо используете утилиту сервиса, либо заполняете веб форму и получаете готовый сертификат. Второй вариант гораздо интереснее. Мы подпишем наш сертификат сами, ключом, на основе которого он был создан:
openssl x509 -signkey domain.key -in domain.csr -req -days 365 -out domain.crt
С помощью параметра -days мы указываем что сертификат будет действительным в течение 365 дней, то есть в течение года. Вы можете объединить все в одну команду и сразу создать закрытый ключ, csr и подписанный сертификат:
openssl req -newkey rsa:2048 -nodes -keyout domain.key
-x509 -days 365 -out domain.crt
Или создаем самоподписанный сертификат openssl из существующего закрытого ключа без csr:
openssl req -key domain.key -new -x509 -days 365 -out domain.crt
Опция -new говорит, что нужно запросить информацию о csr у пользователя. Чтобы браузер доверял ключу нужно этот же сертификат импортировать в список доверенных. А теперь рассмотрим третий способ выполнить создание сертификата OpenSSL — подписать его с помощью собственного CA, центра сертификации.
Вот вы сейчас думаете что это что-то такое сложное, да? А нет, это обычная папка, в которой лежит защищенный паролем закрытый ключ, с помощью которого мы будем подписывать все другие ключи. А открытая пара этого ключа должна быть добавлена во все браузеры, которые будут ему доверять.
Вообще, центр сертификации в крупных корпорациях находится на отдельных компьютерах, которые даже к сети не подключены. Но для примера мы разместим папку в нашей файловой системе /etc/:
Дальше нужно создать самоподписанный сертификат openssl для нашего CA:
openssl req -newkey rsa:4096 -x509 -extensions x509_ca -keyout /etc/ca/certs/ca.key -out /etc/ca/certs/ca.crt -days 3654
Параметр -extensions загружает необходимые расширения для создания сертификата центра сертификации. Мы устанавливаем долгий строк действия — десять лет. Осталось подписать наш сертификат, созданный ранее:
openssl ca -extensions x509_client -in
Готово, теперь наш сертификат подписан. Но теперь, чтобы браузеры ему доверяли нужно добавить сертификат CA в список доверенных браузера.
Просмотр сертификатов
Сертификаты сохраняются в формате pem, а это значит, что вы не сможете их открыть как текстовый файл и нужно использовать специальные команды для просмотра информации о них. Сначала смотрим содержимое csr:
openssl req -text -noout -verify -in domain.csr
Смотрим содержимое сертификата в режиме обычного текста:
openssl x509 -text -noout -in domain.crt
Проверяем действительно ли сертификат подписан нужным CA:
openssl verify -verbose -CAfile ca.crt domain.crt
Просмотр закрытого ключа:
openssl rsa -check -in domain.key
Чтобы проверить связаны ли между собой закрытый ключ, сертификат и открытый ключ можно подсчитать сумы md5 для этих ключей, если значения совпадут, то есть вероятность что это ключи из одной пары:
openssl rsa -noout -modulus -in domain.key | openssl md5
$ openssl x509 -noout -modulus -in domain.crt | openssl md5
$ openssl req -noout -modulus -in domain.csr | openssl md5
Выводы
В этой статье мы рассмотрели как выполняется генерация сертификата openssl, какие бывают сертификаты, ключи и как все эти понятия связаны между собой. Это очень сложная и обширная тема, и недостаточно одной статьи чтобы все охватить, но, надеюсь, что теперь вам намного понятнее как это все работает.
Создаём самоподписанный ssl сертификат с помощью OpenSSL.
Недавно возникла необходимость создать самоподписанный сертификат. Использовал я для этого утилиту OpenSSL и Linux. Собственно этим и хочу с вами поделиться.
Создаём самоподписанный ssl сертификат с помощью OpenSSL.
Для начала нам необходима ОС Linux, в принципе данная утилита есть и пот Windows, но так как есть linux пользуюсь им. В ОС необходимо установить пакет OpenSSL. Устанавливаем его следующей командой (если под админом можно без “sudo”):
После установки OpenSSL, создаём папки, в которых будут лежать наши сертификаты и ключи, например так:
Приступаем к созданию самоподписанного ssl сертификата. Выполняем команду:
- req – это генерация запросов на подпись сертификата, но если мы задаём ключ “-x509”, это означает, что мы генерируем самоподписанный сертификат.
- -newkey rsa:2048 – если у нас ещё нет ключа, мы добавляем данный параметр, что бы ключ был создан автоматически. Указываем параметры ключа.
- -days 365 – указываем количество дней, в течении которых будет действовать данный сертификат.
- -keyout /home/devuser/cert/mykey.key – параметр нужен, так как мы указали newkey и генерируем новый ключ. Указываем в какой фал положим ключ.
- -out /home/devuser/cert/cert.crt – сюда положим наш сертификат.
OpenSSL создаём сертификат
Дальше нас попросят ввести пароль к ключу. Вводим пароль, не меньше 4 символов, и повторяем ввод пароля. Затем нас попросят ввести данные о сертификате (информацию о серверной стороне). Если какие-то данные Вам не нужны можете просто ставить точку (“.”).
Давайте рассмотрим по порядку, что нам предлагают ввести:
- Country Name (2 letter code) [AU]: 77 – страна/регион
- State or Province Name (full name) [Some-State]:. – штат (у нас их нет, поэтому пропускаем)
- Locality Name (eg, city) []:Moscow – город
- Organization Name (eg, company) [Internet Widgits Pty Ltd]:Pechenek.NET – имя организации
- Organizational Unit Name (eg, section) []:. – подразделение организации, пропускаем.
- Common Name (e.g. server FQDN or YOUR name) []:Pechenek.net – Обязательное поле, это имя по которому к серверу будут обращаться.
- Email Address []:[email protected] – адрес электронной почты, тоже можно пропустить.
В итоге мы получили два файла, ключ и сертификат. Ключ-это секретный ключ, публичный ключ находиться в теле самого сертификата. Сам сертификат выглядит так:
OpenSSL самоподписанный сертификат
Убираем пароль с секретного ключа.
Ещё можно немного модифицировать наш скрипт, например убрать пароль с секретного ключа, это в большинстве случаев не удобно, если сервис стартует в автоматическом режиме, в тот момент когда ему необходимо будет получить доступ к секретному ключу, нужно будет вручную ввести пароль.
Добавляем параметр “-nodes”, в результате секретный ключ не будет зашифрован паролем.