certutil.exe и корневые сертификаты

Как распространять утилиту certutil.exe вместе с инсталлятором вашего дистрибутива с целью регистрировать ваши корневые сертификаты для разных платформ (x86 и x64).

Ответ такой - похоже именно эту утилиту certutil.exe не надо тащить с собой в инсталляторе !

Она по-видимому всегда присутствует на всех Windows в каталоге C:\Windows\System32 .

Чтобы зарегистрировать ваш корневой сертификат надо в innosetup указать запрос привилегий администратора:

[Setup]
PrivilegesRequired=admin 

Далее кидаем файл сертификата в каталог будущей программы:

[Files]
Source: "D:\ca\root_01.pem.cer"; DestDir: "{app}"; Flags: ignoreversion

Далее запускаем certutil.exe для установки сертификата :


[Run]
Filename: "certutil.exe"; Parameters: "-addstore Root ""{app}\root_01.pem.cer"""; Flags: waituntilterminated runascurrentuser runhidden; StatusMsg:"Установка корневого сертификата..."; AfterInstall: checkRootCert();

Тут надо понимать , что certutil.exe найдется как раз в C:\Windows\System32.

И по окончании еще можно проверить , что сертификат успешно установлен через AfterInstall: checkRootCert() :


[Code]

procedure checkRootCert(app1:String);
  var
  ResultCode:Integer;
begin

    if (Exec(ExpandConstant('certutil.exe') , ExpandConstant('-verify "{app}\root_01.pem.cer"'), '', SW_HIDE, ewWaitUntilTerminated, ResultCode))  then 
    begin
      if (ResultCode = 0) then 
      begin
          //MsgBox('root_01.pem.cer OK ', mbCriticalError, MB_OK);
      end
      else begin
        MsgBox(ExpandConstant('ошибка установки корневого сертификата root_01.pem.cer  : "{app}\root_01.pem.cer"') + SysErrorMessage(ResultCode), mbCriticalError, MB_OK);
      end;
    end
    else
        MsgBox(ExpandConstant('certutil.exe ошибка установки корневого сертификата : "{app}\root_01.pem.cer"') + SysErrorMessage(ResultCode), mbCriticalError, MB_OK);
    end;
end.

Проверено на innosetup 6.2.0 и на Windows 10-32 и Windows-10-64 !