Full-stack development: Python, PostgreSQL, JavaScript, Linux, Git e t.c.
Создание валидной цепочки SSL сертификатов
Для написания тестов на валидность загружаемых сертификатов мне потребовалось создать несколько вариантов
цепочек и приватных ключей. Прошерстив некоторый объем интернета, я собрал всю необходимую информацию о том,
как локально сгенерировать корректную цепочку SSL сертификатов, которая будет проходить проверку стандартными
средствами.
Чтобы не писать кучу команд всякий раз, напишем bash-скрипт. Для начала, зададим несколько настроечных констант:
Затем пара функций для подготовки и последующей подчистки каталога с настройками:
Все готово к созданию фальшивой, но технически корректной пары корневой сертификат / приватный ключ:
Хорошо, теперь создадим промежуточный сертификат с ключом:
Обратите внимание, что команда на создание промежуточного сертификата берет конфигурацию
корневого ($ROOT_CNF), т.е. подписывать будем им. Также важно, чтобы срок подписываемого
был меньше срока подписывающего.
Ну а теперь, собственно, итог:
Обратите внимение, что проверка осуществляется с указанием не только промежуточного,
но всех CA-сертификатов, предварительно собранных в один файл ($CHAIN_CRT).
И файл запроса, и сертификат создаются с использованием конфигурации промежуточного сертификата.
Темным пятном тут осталось содержимое файлов конфигурации. Они очень похожи на стандартные конфигурации
openssl, за исключением нескольких параметров, касающихся путей размещения служебных файлов и сертификатов для подписи.
Вот эти параметры:
Для корневого:
Для промежуточного:
Строго говоря, проверка корректности уже была произведена в процессе создания.
Но так как мне нужно было делать это в Python, я использовал
библиотеку pyOpenSSL, а именно
модуль crypto. Для примера покажу, как это можно сделать без затей:
Для X509Store можно добавить
флаги проверок,
которые все сломают. К примеру, если добавить вот такой флаг, то получим исключение
OpenSSL.crypto.X509StoreContextError:
А все потому, что будет предпринята попытка скачать CRL-файл, указанный в дополнениях сертификата,
и эта попытка провалится. Как с этим бороться, как добавить Issuer URL и т.п. - это совсем другая история,
которая в принципе вся решается через конфигурацию openssl.