2012-07-13 38 views
3

我打电话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 
+1

也许'Marshal.GetLastWin32Error'可能有助于调试呢? – reuben 2012-07-15 20:27:12

+1

请显示CryptUIWizDigitalSign的p/invoke声明 – 2012-07-16 11:54:37

回答

0

固定 - 仅适用内的32位进程。

+1

任何想法为什么?那是说只有64位进程不被允许访问加密API?因为这听起来......错了。 – 2012-09-24 10:42:18

2

您已经应用了MarshalAs属性上pwszFileName但不pwszTimestampURL,这有什么理由吗?他们在documentation for CRYPTUI_WIZ_DIGITAL_SIGN_INFO相同的描述:

pwszFileName:

的指针,包含要签名的文件的路径和文件名的空终止的Unicode字符串。如果为dwSubjectChoice成员指定了CRYPTUI_WIZ_DIGITAL_SIGN_SUBJECT_FILE,则使用此成员。

pwszTimestampURL:

一个指向包含时间戳的URL一个空结束的Unicode字符串。

+0

您的眼睛敏锐!可悲没有区别... – tomfanning 2012-07-15 20:24:02

+0

谢谢,这是我的问题,这个修复工作。我从IIS(Win 2003)使用这个,但是我强迫IIS以32位进程运行,所以无法确认它是否适用于64位。 – eselk 2014-08-04 19:47:12