为NSIS安装程序设置UAC“发布者”字段

20

当我打开使用 NSIS 创建的安装程序时,UAC 对话框将显示有关我的安装程序的信息。字段 Publisher 是“未知的”。我听说过数字签名应用程序,你知道如何在 NSIS 中实现吗?

我该如何将字段/属性Publisher设置为“My Installer”或其他文本?

我认为以下代码应该设置 Publisher 字段,但它并没有生效,仍然是“未知的”:

InstallDir  "abc"
Name        "def"        
OutFile     "def.exe"

VIProductVersion                 "1.0.0.0"
VIAddVersionKey ProductName      "def"
VIAddVersionKey Comments         "MY DESCRIPTION"
VIAddVersionKey CompanyName      "My Installer"
VIAddVersionKey LegalCopyright   "MY COMPANYNAME"
VIAddVersionKey FileDescription  "MY DESCRIPTION"
VIAddVersionKey FileVersion      1
VIAddVersionKey ProductVersion   1
VIAddVersionKey InternalName     "def"
VIAddVersionKey LegalTrademarks  "PTY LTD"
VIAddVersionKey OriginalFilename "def.exe"

Section
    DetailPrint "Hello World"
SectionEnd

1
除非你想玩未发布的NSIS svn版本,否则你不能轻易更改它。请参见https://dev59.com/7m855IYBdhLWcg3wnFpO - Seki
2
重要的是,那里的“发布者”字段是通过数字签名完成的,发布者就是签名的人。这意味着你需要先购买一个签名。 - Chris Morgan
3个回答

21
您需要使用受Windows信任的证书颁发机构对安装程序进行Authenticode sign(如果要成为Winqual的一部分,则需要特殊证书,而且只允许使用VeriSign)。因为该字段是从数字证书中提取的(如果存在数字证书),而不是从PE版本信息中提取的。
要在构建过程中签名,您可以使用此hack,或者如果您正在使用NSIS v3,则可以使用!finalize命令。

如果证书使用了sha1sha256选项并按照https://dev59.com/eWkv5IYBdhLWcg3wdQnm#58023197中所述添加,则Windows 10将正确显示该字段。 - DrMarbuse
@Anders,我的NSIS安装程序被Windows标记为恶意软件,签名可以解决这个问题吗?还有其他的方法吗?因为我不想购买证书。 - Dragon
@Dragon 你确定它被标记为恶意软件了吗?签名并不能解决这个问题。签名(特别是EV)可以帮助Windows智能屏幕。如果它被检测为恶意软件,请向反病毒厂商提交误报告。 - Anders
@Anders 我每次在应用程序中进行更改时都必须提交报告吗?审核和批准需要多长时间?此外,我是否需要逐个向所有供应商提交请求,还是可以通过集中式存储库提交请求? - Dragon
@Dragon,请在Virustotal上检查哪些产品检测到了您,然后向每个供应商报告。但如果确实是病毒问题,那么您现在已经偏离了主题。 - Anders

8

关于该命令的详细信息,以下是我在使用 NSIS 3.03 版本时与 !finalize 命令一起使用的代码行。

重要提示:您需要在与您的 certificate.pfx 文件相同的目录中提供 passwd.txt 文件中的 codesign 证书密码。

!define PRODUCT_NAME "def"
!define PRODUCT_VERSION "1.0.0.0"
!define OutputFileName "def.exe"

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${OutputFileName}"
InstallDir "abc"
ShowInstDetails show

!define /file OutFileSignPassword ".\CodeSign\passwd.txt"
!define OutFileSignCertificate ".\CodeSign\certificate.pfx"
!define OutFileSignSHA1   ".\CodeSign\signtool.exe sign /f ${OutFileSignCertificate} /p ${OutFileSignPassword} /fd sha1   /t  http://timestamp.comodoca.com /v" 
!define OutFileSignSHA256 ".\CodeSign\signtool.exe sign /f ${OutFileSignCertificate} /p ${OutFileSignPassword} /fd sha256 /tr http://timestamp.comodoca.com?td=sha256 /td sha256 /as /v" 

!finalize "PING -n 1 127.0.0.1 >nul"                                # Delay Next Step to ensure File isn't locked by previous Process 
!finalize "${OutFileSignSHA1} .\${OutputFileName}"                  # CodeSigning with SHA1/AuthentiCode 
!finalize "PING -n 5 127.0.0.1 >nul"                                # Delay Next Step to ensure File isn't locked by previous Process 
!finalize "${OutFileSignSHA256} .\${OutputFileName}"                # CodeSigning with SHA256/RFC 3161  

CRCCheck on

Section
    DetailPrint "Hello World"
SectionEnd

之后,您将能够看到类似以下行的输出:
The following certificate was selected:
    Issued to: Your Company
    Issued by: COMODO RSA Code Signing CA
    Expires:   Sun Mar 15 00:59:59 2020
    SHA1 hash: 0A12223C465069798D940317273C4F56A9BCC6D9

Done Adding Additional Store
Successfully signed: .\def.exe

Number of files successfully Signed: 1

Number of warnings: 0

Number of errors: 0

1

似乎很重要使用两个签名对安装程序进行签名,就像svcabre所实现的那样:

一方面使用sha1算法

"c:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe"
sign /f "YourCertificateFileHere.pfx" /p YourPasswordHere 
/fd sha1 /t http://timestamp.comodoca.com /v "YourInstallerFilePathHere"

另一方面,sha256
"c:\Program Files (x86)\Windows Kits\10\bin\x86\signtool.exe" 
sign /f "YourCertificateFileHere.pfx" /p YourPasswordHere 
/fd sha256 /tr http://timestamp.comodoca.com?td=sha256 
/td sha256 /as /v "YourInstallerFilePathHere"

使用此选项,Windows 10 也能正确显示证书持有者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接