Сертификаты OpenSSL
Сертификаты в первую очередь позволяют идентифицировать человека или сервис, подтвердить что вы тот, за кого себя выдаете.
Работает это так, есть два ключа, закрытый и открытый. Зашифровать сообщение можно с помощью открытого ключа, но чтобы его расшифровать нужен обязательно закрытый ключ. Если у вас нет закрытого ключа, то вы попросту не сможете расшифровать зашифрованное сообщение. Фактически зашифровать сообщение может каждый, но расшифровать его способен только владелец закрытого, секретного ключа.
Если вы смогли расшифровать отправленное сообщение, зашифрованное с помощью вашего открытого ключа, то значит - это вы. Ключи работают только в паре, и вы не сможете расшифровать ничего другим ключом.
Как определить что этот открытый ключ именно ваш и ему можно доверять?
Все просто, достаточно чтобы кто-то из авторитетных источников, например, Comodo или LetsEncrypt подписал ваш ключ. Это так называемые центры сертификации.
Мы будем иметь дело с такими видами ключей:
.pem, .crt, .cer
готовый, подписанный центром сертификации сертификат, расширения разные, но означают одно и то же. Если совсем просто, то сертификат, это подписанный открытый ключ, плюс немного информации о вашей компании.key
закрытый или открытый ключ.csr
запрос на подпись сертификата, в этом файле хранится ваш открытый ключ плюс информация, о компании и домене, которую вы указали
Теперь рассмотрим как создать сертификат openssl
, как его подписать и что для этого нужно сделать. Генерация ключей openssl
, это довольно простая задача, если во всем разобраться.
Создание закрытого ключа
Прежде всего необходимо создать закрытый ключ для сертификата. Для этого нужно использовать команду:
openssl genrsa -out domain.key 2048
Команде необходимо передать имя файла ключа с помощью опции -out
. Вы можете выбрать любое имя, оно не имеет значения. Также можно указать размер ключа, например 2048
. Если этого не сделать, то будет создан ключ размером 512
бит. Все ключи размером меньше 512
бит считаются небезопасными. После выполнения команды в текущей папке появится файл ключа.
Для того чтобы получить сертификат, который можно использовать нужно этот ключ подписать. А для этого надо создать запрос на подпись.
Создание запроса на подпись
При создании запроса на подпись нужно указать необходимую информацию. Обязательное поле здесь только одно CN
. Здесь должно быть указанно ваше доменное имя, для которого вы собираетесь использовать сертификат, также можно указать дополнительную информацию о вашей компании, адресе и организации, но это уже необязательно. Для создания запроса на подпись для ранее созданного ключа используйте такую команду:
openssl req -key domain.key -new -out domain.csr
Во время создания запроса большинство параметров можно оставить по умолчанию. Обязательно заполнять только Common Name (e.g. server FQDN or YOUR name). Если вы хотите создать сертификат для сайта, то в этом поле нужно указать домен этого сайта. В этом примере будет создан сертификат для localhost
:
Можно создать закрытый ключ и запрос на подпись открытого ключа одной командой:
openssl req -newkey rsa:2048 -nodes -keyout domain.key -out domain.csr
Опция -newkey
указывает, что нужно создать новую пару ключей, а в параметрах мы сообщаем тип rsa
и сложность 2048
байт. Опция -nodes
указывает, что шифровать ключ не нужно, опция -new
указывает что нужно создать запрос csr
.
Можно создать csr
запрос из уже существующего сертификата и закрытого ключа, тогда вам не придется вводить информацию, она будет получена из сертификата:
openssl x509 -in domain.crt -signkey domain.key -x509toreq -out domain.csr
Параметр -x509toreq
указывает, что нужно использовать сертификат для X509
для получения CSR
. X509
, это сертификаты, подписанные сами собой. Обычно сертификат подписывается другим сертификатом, а этот был подписан сам собой. Если вы получили сертификат от CA
, то этот параметр не нужен.
Подпись сертификатов
Допустим, у вас есть приватный ключ и запрос на подпись. Теперь вам нужно его подписать чтобы получить сертификат, который можно использовать, тут есть несколько вариантов:
- Можно отправить
csr
файл на подпись какому-либо центру сертификации, например LetsEncrypt - Можно подписать сертификат тем же ключом, с помощью которого он был создан
- Можно создать свой центр сертификации
Первый способ я рассматривать не буду. Здесь все просто. Либо используете утилиту сервиса, либо заполняете веб форму и получаете готовый сертификат. Второй вариант гораздо интереснее.
Подпись сертификата самим собой
Мы подпишем наш сертификат сами, ключом, на основе которого он был создан:
openssl x509 -signkey domain.key -in domain.csr -req -days 365 -out domain.crt
С помощью параметра -days
мы указываем что сертификат будет действительным в течение 365 дней, то есть в течение года. Обратите внимание, что во время подписи проверяется CN
, поэтому если вы не зададите этот параметр на этапе создания запроса на подпись, то ничего не заработает.
Вы можете объединить все в одну команду и сразу создать закрытый ключ, 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
, центра сертификации.
По сути это обычная папка, в которой лежит защищенный паролем закрытый ключ, с помощью которого мы будем подписывать все другие ключи. А открытая часть этого ключа должна быть добавлена во все браузеры, которые будут ему доверять.
Вообще, центр сертификации в крупных корпорациях находится на отдельных компьютерах, которые даже к сети не подключены. Но для примера мы разместим папку в нашей домашней папке:
mkdir ./ca && cd ./ca
Дальше нужно создать самоподписанный сертификат openssl
для нашего CA
:
openssl req -newkey rsa:2048 -nodes -keyout ca.key -x509 -days 3654 -out ca.crt
С помощью параметра -days
мы устанавливаем долгий строк действия. Программа запросит стандартные данные, которые используются при создании сертификатов. Эти данные будут выводится в браузере при просмотре информации о центре сертификации если вы будете использовать подписанные сертификаты для HTTPS. В поле Common Name
можно указать имя вашей организации.
Осталось подписать наш сертификат, созданный ранее:
openssl x509 -req -in ../domain.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out ../domain.crt -days 365
Готово, теперь наш сертификат подписан. Но теперь, чтобы браузеры ему доверяли нужно добавить сертификат CA
в список доверенных сертификатов браузера.
Просмотр сертификатов
Сертификаты сохраняются в формате PEM
, а это значит, что вы не сможете их открыть как текстовый файл и нужно использовать специальные команды для просмотра информации о них. Сначала смотрим содержимое CSR
:
openssl req -text -noout -verify -in domain.csr
Смотрим содержимое сертификата в режиме обычного текста:
openssl x509 -text -noout -in domain.crt
Проверяем действительно ли сертификат подписан нужным CA
:
openssl verify -verbose -CAfile ./ca/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 вы выбрали у вас будет два файла. Это файл закрытого ключа с расширением .key
и файл сертификата с расширение .crt
. В данном примере это:
domain.key
domain.crt
Также вам может понадобится сертификат fullchain
. Обычно этот файл содержит сам подписанный сертификат и сертификаты промежуточных центров сертификации. Но в случае если вы подписываете сертификат своим центром сертификации, промежуточных сертификатов у вас нет, а значит в качестве fullchain
можно использовать сам подписанный сертификат.
Если вы хотите подключить ваши сертификаты к Apache
, используйте такие директивы в файле виртуального хоста:
nano /etc/apache2/sites-enabled/000-default.conf
SSLEngine on
SSLCertificateFile /путь/к/сертификату/domain-server.crt
SSLCertificateKeyFile /путь/к/файлу/domain.key
SSLCertificateChainFile /путь/к/файлу/domain-server.crt
Для Nginx
директивы подключения сертификатов выглядят похожим образом. Их нужно добавить внутри блока server
для сайта на котором вы хотите настроить HTTPS
:
ssl_certificate /путь/к/файлу/domain-server.crt
ssl_certificate_key /путь/к/файлу/domain.key