Хотелось бы создать некий свой корневой сертификат (самописный) и от него выпускать сертификаты например подписания кода.
Если в 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 в доверенные корневые сертификаты , иначе не удастся корневым подписать подчиненный.