Signing a Win32 Script File with Authenticode tools

M. Gallant 06/10/2002

Windows Script 5.6 introduces the capability to digitally sign win32 script files (wsf, vbs, vbe, js, jse) as well as the previously supported file types for Authenticode signatures (.exe, .dll, .ocx, .cab, .cat, .ctl types). Much more comprehensive support for X509 Certificates, signatures and encryption is available with the CAPICOM 2 Platform SDK redistributable. The script-signing functionality introduced with wsh5.6 also provides this capability to the Microsoft Authenticode tool signcode.exe . To manually verify the integrity of a signed file, the Authenticode tool chktrust.exe can be used.

The example below shows a typical .vbs script, signed and time-stamped using this command:

signcode -cn "Security Development" -n "ShowMyShares Script" -t "http://timestamp.verisign.com/scripts/timstamp.dll" -i "http://www.nortelnetworks.com/help/certificates" ShowMyShares.vbs

When the signed script is manually verified using chktrust ShowMyShares.vbs, the following security screens are shown:


However, if even one character (including any whitespace) in the original script is changed in the file, the signed script verification fails with the following screens:




The vbs script: Note that "time stamping" ensures that the signature will continue to be recognized as valid, even after the code-signing certificate expires (typically 1 year from date of issuance). Note also that time-stamping increases the size of the signature block, since the VeriSign time-stamp certificates are appended.

'**************************************************************** ' File: ShowMyShares.vbs (WSH for VBscript) ' Author: (c) M. Gallant 10/04/2000 ' ' Displays Windows Shared Network Resources ' Win95/98: Launches C:\windows\netwatch.exe if installed. ' WinNT/2000: Runs "net share" system command in DOS window. ' '**************************************************************** Option Explicit Dim WshShell, fso, WshEnvir, netwatch, netshare, environ set WshShell = WScript.CreateObject("WScript.Shell") set fso = WScript.CreateObject("Scripting.FileSystemObject") set WshEnvir = WshShell.Environment("Process") netwatch = "C:\Windows\netwatch.exe" netshare = "%comspec% /K net share" If WshEnvir("OS") = "Windows_NT" Then WshShell.Run netshare ElseIf fso.FileExists(netwatch) Then WshShell.Run netwatch Else WScript.Echo "File " & netwatch & " not found." WScript.Quit End If '------------------ End Script ----------------------------------- '' SIG '' Begin signature block '' SIG '' MIILnQYJKoZIhvcNAQcCoIILjjCCC4oCAQExDjAMBggq '' SIG '' hkiG9w0CBQUAMGYGCisGAQQBgjcCAQSgWDBWMDIGCisG '' SIG '' AQQBgjcCAR4wJAIBAQQQTvApFpkntU2P5azhDxfrqwIB '' SIG '' AAIBAAIBAAIBAAIBADAgMAwGCCqGSIb3DQIFBQAEEANb '' SIG '' cnN5AbFOJXdWatnkOMigggcnMIIDOzCCAqSgAwIBAgIE '' SIG '' NlUYijANBgkqhkiG9w0BAQUFADAvMRgwFgYDVQQKEw9u '' SIG '' b3J0ZWwgZXh0ZXJuYWwxEzARBgNVBAsTCk5vcmxvY2tQ '' SIG '' S0kwHhcNMDAxMTA5MTkxMjM5WhcNMDExMTA5MTk0MjM5 '' SIG '' WjBLMRgwFgYDVQQKEw9ub3J0ZWwgZXh0ZXJuYWwxEDAO '' SIG '' BgNVBAsTB2RldmljZXMxHTAbBgNVBAMTFFNlY3VyaXR5 '' SIG '' IERldmVsb3BtZW50MIGfMA0GCSqGSIb3DQEBAQUAA4GN '' SIG '' ADCBiQKBgQDDM3zAKyAl90JF5vIIyZyR5ko+IC+dkyW4 '' SIG '' mApVACp3ihg9hz+iGjH3o2mwp81QHl6u79z9V+nO7CGN '' SIG '' zVPMTKDYKhLXATHkmJCFOvkOH+NmI8L8kwV30pnnKaVu '' SIG '' iz5BRLmZbIiIcPKlObAJ8gQxImIloqkuVh2sBDr6eKmH '' SIG '' M0NBlwIDAQABo4IBRjCCAUIwCwYDVR0PBAQDAgeAMCsG '' SIG '' A1UdEAQkMCKADzIwMDAxMTA5MTk0MjM5WoEPMjAwMTA3 '' SIG '' MjMwNzQyMzlaMBEGCWCGSAGG+EIBAQQEAwIEEDA5BgNV '' SIG '' HREEMjAwgRZtaWdAYW1lcmljYXNtOTcubnQuY29tgRZt '' SIG '' aWdAbm9ydGVsbmV0d29ya3MuY29tMFIGA1UdHwRLMEkw '' SIG '' R6BFoEOkQTA/MRgwFgYDVQQKEw9ub3J0ZWwgZXh0ZXJu '' SIG '' YWwxEzARBgNVBAsTCk5vcmxvY2tQS0kxDjAMBgNVBAMT '' SIG '' BUNSTDE3MB8GA1UdIwQYMBaAFOEqU97XDk9ZxcxEa6K5 '' SIG '' X90OzsC9MB0GA1UdDgQWBBRXdtH4L2lPoUsRE5U7jiwF '' SIG '' g1khvjAJBgNVHRMEAjAAMBkGCSqGSIb2fQdBAAQMMAob '' SIG '' BFY0LjADAgOoMA0GCSqGSIb3DQEBBQUAA4GBALmWjuNJ '' SIG '' xx4CpG1R3OEWCl88fUygR9PjfDZEDvx+HjZOioXc6BCc '' SIG '' otADJ1p1+TcLjcAewea7BYfu5b38Js8oBRhPubjL41EP '' SIG '' AadMVVWMyZDGokdvMstiZ6z6D4RdthiEDae7xDMyzlj2 '' SIG '' KlrLa3amDQMe+Wcavkh7noIj+3pWYwlFMIID5DCCA02g '' SIG '' AwIBAgIRAPykpZ8sD8C5A5gzG3tUVB0wDQYJKoZIhvcN '' SIG '' AQEEBQAwgZ4xHzAdBgNVBAoTFlZlcmlTaWduIFRydXN0 '' SIG '' IE5ldHdvcmsxFzAVBgNVBAsTDlZlcmlTaWduLCBJbmMu '' SIG '' MSwwKgYDVQQLEyNWZXJpU2lnbiBUaW1lIFN0YW1waW5n '' SIG '' IFNlcnZpY2UgUm9vdDE0MDIGA1UECxMrTk8gTElBQklM '' SIG '' SVRZIEFDQ0VQVEVELCAoYyk5NyBWZXJpU2lnbiwgSW5j '' SIG '' LjAeFw05OTExMTYwMDAwMDBaFw0wNDAxMDYyMzU5NTla '' SIG '' MIGyMRcwFQYDVQQKEw5WZXJpU2lnbiwgSW5jLjEfMB0G '' SIG '' A1UECxMWVmVyaVNpZ24gVHJ1c3QgTmV0d29yazFGMEQG '' SIG '' A1UECxM9d3d3LnZlcmlzaWduLmNvbS9yZXBvc2l0b3J5 '' SIG '' L1JQQSBJbmNvcnAuIGJ5IFJlZi4sTElBQi5MVEQoYyk5 '' SIG '' ODEuMCwGA1UEAxMlVmVyaVNpZ24gVGltZSBTdGFtcGlu '' SIG '' ZyBTZXJ2aWNlIENBIFNXMTCCASIwDQYJKoZIhvcNAQEB '' SIG '' BQADggEPADCCAQoCggEBANSY6GeSwW0Rs6r4p8/IKjLG '' SIG '' 6vLMLKbSBZ8af6Dnvi9PX+DQG7hyGM+pRRNB7Bkvw0DL '' SIG '' kuYRLY+WTWKXpa8cBi8zBdRApd0dGtWw9LgDbdWG+0/W '' SIG '' XxBJ3rfkChZOZQxFIwrH/5+SKRE7gTeSRtC0m1gjYFLN '' SIG '' 97MPss92CnCII2G5h83C3LLOcLEG42Ky9REK6EhyyYey '' SIG '' NwnGUywFKZWbv4xIGDIFJgWvrCw0g1BOSkowj2KlngIV '' SIG '' hR7qK0dxme5TGt4NRVHN9DKl7+ae/PHL+Nkyk5939jDy '' SIG '' uYWSUtegSTnq57QVjsKPM+aJjZRgmVmiAlYRQvgl7OcR '' SIG '' mP6Bj5iImxUCAwEAAaOBhzCBhDATBgNVHSUEDDAKBggr '' SIG '' BgEFBQcDCDBPBgNVHSAESDBGMEQGC2CGSAGG+EUBBwEB '' SIG '' MDUwMwYIKwYBBQUHAgEWJ2h0dHBzOi8vd3d3LnZlcmlz '' SIG '' aWduLmNvbS9yZXBvc2l0b3J5L1JQQTAPBgNVHRMECDAG '' SIG '' AQH/AgEAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQQF '' SIG '' AAOBgQB86p3zlJFDoyG62/OG83tYBHmIGPqyS2w/zAch '' SIG '' XtfDNcuTiPRRQ+0tqSyhccfHtQMxJenJEfskFYpz4tlM '' SIG '' w0f7dYIMHgA77eunlU9gZmOGSGTeKBtyrl9YjhHkwAKL '' SIG '' aVW3GSg0qxivMlDUWzxF9CuMVEaJzMiopKWlGMxzTiYF '' SIG '' dDGCA+AwggPcAgEBMDcwLzEYMBYGA1UEChMPbm9ydGVs '' SIG '' IGV4dGVybmFsMRMwEQYDVQQLEwpOb3Jsb2NrUEtJAgQ2 '' SIG '' VRiKMAwGCCqGSIb3DQIFBQCggawwGQYJKoZIhvcNAQkD '' SIG '' MQwGCisGAQQBgjcCAQQwHwYJKoZIhvcNAQkEMRIEEDh+ '' SIG '' xNr3rV8EeCfauS1FvwowbgYKKwYBBAGCNwIBDDFgMF6g '' SIG '' KIAmAFMAaABvAHcATQB5AFMAaABhAHIAZQBzACAAUwBj '' SIG '' AHIAaQBwAHShMoAwaHR0cDovL3d3dy5ub3J0ZWxuZXR3 '' SIG '' b3Jrcy5jb20vaGVscC9jZXJ0aWZpY2F0ZXMgMA0GCSqG '' SIG '' SIb3DQEBAQUABIGADKK2t2UQUKw5vJ9PfqMz7PbrcVCI '' SIG '' JAFouy8swSI4EEajlDVO++Fveqx2dVRjxbMX5nUosbwe '' SIG '' YJhS39MNbRxyU0ffSXbOV8G24FMRSiwxxdlaXSn7db28 '' SIG '' pRtDBjgrNWIJrqHwfDpynS2Ap+DPn3WBssUPStHgaCJV '' SIG '' /1Cc1n9QKqOhggJNMIICSQYJKoZIhvcNAQkGMYICOjCC '' SIG '' AjYCAQEwgbQwgZ4xHzAdBgNVBAoTFlZlcmlTaWduIFRy '' SIG '' dXN0IE5ldHdvcmsxFzAVBgNVBAsTDlZlcmlTaWduLCBJ '' SIG '' bmMuMSwwKgYDVQQLEyNWZXJpU2lnbiBUaW1lIFN0YW1w '' SIG '' aW5nIFNlcnZpY2UgUm9vdDE0MDIGA1UECxMrTk8gTElB '' SIG '' QklMSVRZIEFDQ0VQVEVELCAoYyk5NyBWZXJpU2lnbiwg '' SIG '' SW5jLgIRAPykpZ8sD8C5A5gzG3tUVB0wDAYIKoZIhvcN '' SIG '' AgUFAKBZMBgGCSqGSIb3DQEJAzELBgkqhkiG9w0BBwEw '' SIG '' HAYJKoZIhvcNAQkFMQ8XDTAwMTEyMjE2MjE1MVowHwYJ '' SIG '' KoZIhvcNAQkEMRIEEDtSnYz/sSqcrR27bX881Y0wDQYJ '' SIG '' KoZIhvcNAQEBBQAEggEAt9x0/+TLqumLoSre4tp1vn4/ '' SIG '' jRO5VV5JSXyzQUCwMUu+Gr5yXx1RJVOkfknV/pTeJScd '' SIG '' PKye8kDw6xOkRapxA0Ape9aT9IebX+bwSkDepAxQE8Z4 '' SIG '' 8wdcdb/485ZRsoBSI7OP9QxISXQ2dTcqXi6t/kl6K9rL '' SIG '' 2wk5uW7eVSWFuHPZLxAjpkJfhU2mLM9YADOcFwEuML3j '' SIG '' R0JgBW+ANxvM7U+FN6i1gX03rT15wyMvgOA9Jg6LeR8Z '' SIG '' b7t6u9J0pOnOBFudXfVDftmgNKAq8wTRKDWmBKKC8DFN '' SIG '' houuV7eBmUxHlvK4oGuQNaR1rhuxIOgg66iHRz/6ySQ5 '' SIG '' DJzmM5wRPQ== '' SIG '' End signature block