CryptUIWizDigitalSignを呼び出して、UI を表示せずに公開コード署名証明書を使用してプログラムで実行可能ファイルに署名すると、問題が発生します。証明書は Comodo コード署名証明書です。
タイムスタンプ URL パラメーターが null に設定されている場合は問題なく動作しますが、null 以外のものを渡すと、呼び出しは失敗します (0 が返されます)。
問題は、タイムスタンプがないと副署名がないことです。そのため、署名の有効性の問題はさらに先に進みます。
環境は Windows7 x64 です。正常に動作する標準のインターネット接続があります。ネットワーク トラフィックをスニッフィングするCryptUIWizDigitalSign
と、タイムスタンプ サーバーへの接続が試行されていないように見えます。
私は PInvoke を介して .NET からこれを呼び出していますが、違いがあるとは思えません。
この機能についてはネット上ではあまり多くありません...
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