我打电话CryptUIWizDigitalSign时以编程方式签署与我们的公共代码签名证书的可执行文件,没有显示任何UI有问题失败。证书是Comodo代码签名证书。CryptUIWizDigitalSign当pwszTimestampURL指定
时的时间戳URL参数设置为null它工作正常,但每当我经过比,调用失败,返回NULL以外的任何其他(返回零)。
的问题是,没有一个时间戳,没有会签,因此进一步有签名的有效性问题的路线。
环境是Windows 7 x64。有一个工作标准的互联网连接。从嗅探网络流量看来,CryptUIWizDigitalSign
未尝试联系时间戳服务器。
我从.NET通过的PInvoke调用此,但我怀疑,这将使任何区别。
不是很多关于此功能的网...
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_INFO类型被定义为:
<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
也许'Marshal.GetLastWin32Error'可能有助于调试呢? – reuben 2012-07-15 20:27:12
请显示CryptUIWizDigitalSign的p/invoke声明 – 2012-07-16 11:54:37