调用CryptUIWizDigitalSign以编程方式使用我们的公共代码签名证书对可执行文件进行签名时,出现问题,而不显示任何UI。 证书是Comodo代码签名证书。
当timestamp URL参数设置为null时,它工作正常,但是每当我传入除null之外的任何内容时,调用将失败(返回零)。
问题是如果没有时间戳,就没有联署符号,所以还有签名有效性问题。
环境是Windows 7 x64。 有一个工作标准的互联网连接。 从嗅探networkingstream量看来, CryptUIWizDigitalSign
没有尝试联系时间戳服务器。
我通过PInvoke从.NET调用它,但是我怀疑这会有什么不同。
关于这个function在网上不是很多…
Dim cert As X509Certificate2 = New X509Certificate2("mycert.pfx", "password") Dim pSigningCertContext As IntPtr = cert.Handle Dim digitalSignInfo As CRYPTUI_WIZ_DIGITAL_SIGN_INFO = New CRYPTUI_WIZ_DIGITAL_SIGN_INFO digitalSignInfo.dwSize = Marshal.SizeOf(digitalSignInfo) digitalSignInfo.dwSubjectChoice = CRYPTUI_WIZ_DIGITAL_SIGN_SUBJECT_FILE digitalSignInfo.pwszFileName = "C:\temp\installer.exe" digitalSignInfo.dwSigningCertChoice = CRYPTUI_WIZ_DIGITAL_SIGN_CERT digitalSignInfo.pSigningCertContext = pSigningCertContext digitalSignInfo.pwszTimestampURL = "http://timestamp.comodoca.com/authenticode" digitalSignInfo.dwAdditionalCertChoice = 0 digitalSignInfo.pSignExtInfo = IntPtr.Zero If (Not CryptUIWizDigitalSign(CRYPTUI_WIZ_NO_UI, IntPtr.Zero, vbNullString, digitalSignInfo, pSignContext)) Then Throw New Win32Exception(Marshal.GetLastWin32Error(), "CryptUIWizDigitalSign") End If
CRYPTUI_WIZ_DIGITAL_SIGN_INFOtypes定义如下:
<StructLayout(LayoutKind.Sequential)> _ Public Structure CRYPTUI_WIZ_DIGITAL_SIGN_INFO Public dwSize As Int32 Public dwSubjectChoice As Int32 <MarshalAs(UnmanagedType.LPWStr)> Public pwszFileName As String Public dwSigningCertChoice As Int32 Public pSigningCertContext As IntPtr Public pwszTimestampURL As String Public dwAdditionalCertChoice As Int32 Public pSignExtInfo As IntPtr End Structure Public Const CRYPTUI_WIZ_DIGITAL_SIGN_SUBJECT_FILE As Int32 = 1 Public Const CRYPTUI_WIZ_DIGITAL_SIGN_CERT As Int32 = 1 Public Const CRYPTUI_WIZ_NO_UI As Int32 = 1
你已经在pwszFileName
上应用了MarshalAs
属性,但是没有应用pwszTimestampURL
,这有什么理由吗? 在CRYPTUI_WIZ_DIGITAL_SIGN_INFO的文档中对它们进行了相同的描述:
pwszFileName:
指向以空字符结尾的Unicode字符串的指针,该字符串包含要签名的文件的路径和文件名。 如果为dwSubjectChoice成员指定了CRYPTUI_WIZ_DIGITAL_SIGN_SUBJECT_FILE,则使用此成员。
pwszTimestampURL:
指向包含时间戳URL的以空字符结尾的Unicode字符串的指针。
固定 – 仅在32位进程内工作。