从Inno Setup中的pfx获取证书指纹

时间:2016-11-04 16:27:24

标签: ssl inno-setup

我正试图从Inno Setup安装程序为我的Web服务配置HTTPS连接。以前,我正在做下一件事:

  1. 使用makecert
  2. 创建自签名服务器证书
  3. 使用certmgr
  4. 将证书安装到本地计算机个人证书
  5. 使用Inno Setup的GetSHA1OfFile方法获取其指纹/散列。
  6. 使用netsh http add sslcert命令
  7. 将证书分配给端口

    但是现在我从makecert切换到OpenSSL,并且还引入了先前生成的CA证书,并作为我的服务器证书的颁发者。我现在在做什么:

    1. 使用certmgr
    2. 安装CA证书
    3. 使用OpenSSL从CA证书生成服务器证书。服务器证书由实际证书和私钥组成
    4. 使用OpenSSL
    5. 将证书和私钥组合为pfx文件格式
    6. 使用CertUtil
    7. 安装pfx文件

      现在,问题是,在使用OpenSSL生成证书时,似乎它的sha1哈希与其指纹不同,因此我不能再使用GetSHA1OfFile

      所以,问题是 - 如果GetSHA1OfFile不能用于此目的,我如何以编程方式在Inno Setup中获取证书哈希,将其分配给端口?

1 个答案:

答案 0 :(得分: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;