создаем CA через openssl

Хотелось бы создать некий свой корневой сертификат (самописный) и от него выпускать сертификаты например подписания кода.

Если в Windows установить наш само-подписной сертификат в корневые доверенные, то установка программы , которая подписана этим сертификатом, не должна быть заблокирована операционной системой Windows, его защитником , антивирусом и т.д. Потому ,что мы ему доверились интерактивно.

Кстати само-подписной сертификат можно установить и из инсталлятора (например inno setup), только придется запросить права администратора при установке (конечно же).

Примечание: создать полноценный корневой сертификат из Power Shell оболочки не получается , потому что похоже там не хватает функционала добавления Ditribution points. Имеется ввиду не прописать url сервера , где лежат списки отозванных сертификатов.

Поэтому переходим к созданию сертификатов непосредственно через библиотеку openssl.

Первый этап : создание корневого сертификата

Создавать надо сроком побольше лет на 20-30 с ключом получше (4096 например).
Надо помнить , что корневой сертификат может только сам себя подписать.

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

@echo off

SET PATH=D:OpenSSL1_1_1_dllin;%PATH%

openssl genrsa -out root.key 4096
::openssl genrsa -des3 -passout file:ca.enc -out private/cakey.pem 4096
IF NOT %ERRORLEVEL% EQU 0 GOTO :ERROR_EXIT
pause

openssl req -new -key root.key -out root.csr -config root_req.config
IF NOT %ERRORLEVEL% EQU 0 GOTO :ERROR_EXIT
pause

openssl ca -in root.csr -out root.pem  -config root.config -selfsign -extfile ca.ext -days 36500
IF NOT %ERRORLEVEL% EQU 0 GOTO :ERROR_EXIT
pause

openssl x509 -in root.pem -out certs/root.pem -outform PEM
IF NOT %ERRORLEVEL% EQU 0 GOTO :ERROR_EXIT
pause

openssl x509 -inform PEM -in certs/root.pem -outform DER -out root.cer
IF NOT %ERRORLEVEL% EQU 0 GOTO :ERROR_EXIT
pause

exit

:ERROR_EXIT
echo ------------------------------------------
echo ---------- ERROR_EXIT-------------
echo ------------------------------------------
pause
exit

файл root_req.config , здесь удобно размещать строковые переменные для формирования сертификата :

[ req ]
distinguished_name = req_distinguished_name
prompt             = no

[ req_distinguished_name ]
countryName = RU
commonName  = BIT CA
stateOrProvinceName	= Sankt Peterburg
localityName	= Sankt Peterburg
0.organizationName	= BIT Ltd
emailAddress	= p@kkmspb.ru

Тут важно , что в результате в файле root.chain.pem будет не только закрытый ключ , но и цепочка от издателя (его открытая часть ключа и зашифрованный хэш). В нашем случае издатель равен потомку.

В root.key.pem будет только закрытая часть ключа.

Выпускаем подчиненный сертификат

Это будет промежуточный центр нашей сертификации. промежуточный нужен для удобства управления цепочкой доверия : корневой выпустили на 30 лет (на отключенном от интернета ПК) и сразу убрали подальше.

Потом достали корневой выпустили промежуточный и корневой убрали подальше.

Перед созданием подчиненного сертификата НЕ ЗАБЫТЬ текущий (корневой) добавить под Windows в доверенные корневые сертификаты , иначе не удастся корневым подписать подчиненный.