2016-11-04 5 views
1

Я пытаюсь настроить HTTPS-соединение для моего веб-сервиса у установщика Inno Setup. Раньше я делал следующие вещи:Получить отпечаток сертификата от pfx в Inno Setup

  1. Созданный сертификат самоподписанный сервера с makecert
  2. установлен сертификат на локальной машине персональных сертификатов с использованием certmgr
  3. Получено его отпечаток/хэш с помощью GetSHA1OfFile метод установки Inno.
  4. Assigned сертификат на порт с помощью команды netsh http add sslcert

Но теперь я переход от makecert к OpenSSL, а также введение сертификата ЦС, который ранее создан и работает как эмитентом для сертификата сервера. Что я сейчас делаю:

  1. Установить сертификат CA, с помощью certmgr
  2. Генерация сертификата сервера из ЦС сертификат, используя OpenSSL. Сертификат сервера состоит из фактического сертификата и закрытого ключа
  3. Комбинат сертификата и закрытого ключа в формате PFX файла, используя OpenSSL
  4. Установить файл PFX, используя CertUtil

Теперь вопрос, при создании сертификата с помощью OpenSSL , кажется, что его sha1-хэш отличается от его отпечатка пальца, поэтому я больше не могу использовать GetSHA1OfFile для этой цели.

Итак, вопрос в том, как я могу программно получить хэш сертификата в Inno Setup, назначить его порту, если GetSHA1OfFile не может быть использован для этой цели?

ответ

1

Используйте certutil.exe -dump command и прочитайте его вывод.

Я не уверен, какой из отпечатков пальцев вы после, но я предполагаю, что это тот, который помечен как Cert Hash(sha1).

var 
    Key: string; 
    I: Integer; 
    TempFile: string; 
    Lines: TArrayOfString; 
    Hash: string; 
    ResultCode: Integer; 
    PfxFile: string; 
    Params: string; 
begin 
    PfxFile := '...\my.pfx'; 
    TempFile := ExpandConstant('{tmp}\certdump.txt'); 
    Params := '/c certutil.exe -dump "' + PfxFile + '" > "' + TempFile + '"'; 
    if not Exec('cmd.exe', Params, '', SW_HIDE, ewWaitUntilTerminated, ResultCode) then 
    begin 
    Log('Failed to run certificate dump'); 
    end 
    else 
    if not LoadStringsFromFile(TempFile, Lines) then 
    begin 
    Log('Failed to read certificate dump'); 
    end 
    else 
    begin 
    Key := 'Cert Hash(sha1):'; 
    Hash := ''; 
    for I := 0 to GetArrayLength(Lines) - 1 do 
    begin 
     if CompareText(Copy(Lines[I], 1, Length(Key)), Key) = 0 then 
     begin 
     Hash := Trim(Copy(Lines[I], Length(Key) + 1, Length(Lines[I]) - Length(Key))); 
     StringChange(Hash, ' ', ''); 
     end; 
    end; 
    DeleteFile(TempFile); 

    if Hash = '' then 
    begin 
     Log('Hash not found in certificate dump'); 
    end 
     else 
    begin 
     Log('Certificate hash: ' + Hash); 
    end; 
    end; 
end;