4

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
4

2 に答える 2

3

MarshalAsに属性を適用しましたが、 には適用しpwszFileNameませんでしpwszTimestampURLた。何か理由はありますか? CRYPTUI_WIZ_DIGITAL_SIGN_INFOのドキュメントでも同じように説明されています。

pwszファイル名:

署名するファイルのパスとファイル名を含む null で終わる Unicode 文字列へのポインター。このメンバーは、dwSubjectChoice メンバーに CRYPTUI_WIZ_DIGITAL_SIGN_SUBJECT_FILE が指定されている場合に使用されます。

pwszTimestampURL:

タイム スタンプの URL を含む null で終わる Unicode 文字列へのポインター。

于 2012-07-15T19:50:36.310 に答える
0

修正済み - 32 ビット プロセス内でのみ動作します。

于 2012-08-16T21:08:49.313 に答える