SignTool Проверить эквивалент для файлов .application и .manifest?

Я использую signtool.exe v6.2.9200.20527 для поддержки переключателей / tr и / td. В следующих примерах 0961 ... 35d2 - это отпечаток SHA1 сертификата подписи кода SHA256 в хранилище личных> сертификатов текущего пользователя.

Пример 1. Подписание кода дайджестом SHA256, без отметки времени.

c:signtool.exe sign /fd sha256 /sha1 0961...35d2 CertificateCheck.exe
c:signtool.exe verify /all /pa CertificateCheck.exe

File: CertificateCheck.exe
Index  Algorithm  Timestamp
========================================
0      sha256     None

Successfully verified: CertificateCheck.exe

Пример 2: Подпись кода дайджестом SHA1, без отметки времени.

c:signtool.exe sign /fd sha1 /sha1 0961...35d2 CertificateCheck.exe
c:signtool.exe verify /all /pa CertificateCheck.exe

File: CertificateCheck.exe
Index  Algorithm  Timestamp
========================================
0      sha1       None

Successfully verified: CertificateCheck.exe

Пример 3: Двойная подпись с дайджестом SHA256 и дайджестом SHA1 и с отметкой времени.

c:signtool.exe sign /fd sha256 /sha1 0961...35d2 /tr http://timestamp.globalsign.com/scripts/timstamp.dll /td sha256 CertificateCheck.exe
c:signtool.exe sign /as /fd sha1 /sha1 0961...35d2 /tr http://timestamp.globalsign.com/scripts/timstamp.dll /td sha1  CertificateCheck.exe
c:signtool.exe verify /all /pa CertificateCheck.exe

File: CertificateCheck.exe
Index  Algorithm  Timestamp
========================================
0      sha256     RFC3161
1      sha1       RFC3161

Используя signtool verify / v, я также могу увидеть детали сертификата и цепочку доверия сертификатов ...

c:signtool.exe verify /all /pa /v CertificateCheck.exe

Verifying: CertificateCheck.exe
Signature Index: 0 (Primary Signature)
Hash of file (sha256): 6774...B2D1

Signing Certificate Chain:
    Issued to: GlobalSign
    Issued by: GlobalSign
    Expires:   Sun Mar 18 20:00:00 2029
    SHA1 hash: D69B...76AD

        Issued to: GlobalSign CodeSigning CA - SHA256 - G2
        Issued by: GlobalSign
        Expires:   Fri Aug 02 20:00:00 2019
        SHA1 hash: 4E34...36FF

            Issued to: Example Company Pty Ltd
            Issued by: GlobalSign CodeSigning CA - SHA256 - G2
            Expires:   Fri May 11 02:17:24 2018
            SHA1 hash: 0961...35D2

The signature is timestamped: Wed May 06 13:51:05 2015
Timestamp Verified by:
    Issued to: GlobalSign Root CA
    Issued by: GlobalSign Root CA
    Expires:   Fri Jan 28 22:00:00 2028
    SHA1 hash: B1BC...829C

        Issued to: GlobalSign Timestamping CA - G2
        Issued by: GlobalSign Root CA
        Expires:   Fri Jan 28 22:00:00 2028
        SHA1 hash: C0E4...5B71

            Issued to: GlobalSign TSA for Standard - G2
            Issued by: GlobalSign Timestamping CA - G2
            Expires:   Tue Mar 03 10:00:00 2026
            SHA1 hash: 19E1...65B6

Signature Index: 1
Hash of file (sha1): CFA4...7863

Signing Certificate Chain:
    Issued to: GlobalSign
    Issued by: GlobalSign
    Expires:   Sun Mar 18 20:00:00 2029
    SHA1 hash: D69B...76AD

        Issued to: GlobalSign CodeSigning CA - SHA256 - G2
        Issued by: GlobalSign
        Expires:   Fri Aug 02 20:00:00 2019
        SHA1 hash: 4E34...36FF

            Issued to: Example Company Pty Ltd
            Issued by: GlobalSign CodeSigning CA - SHA256 - G2
            Expires:   Fri May 11 02:17:24 2018
            SHA1 hash: 0961...35D2

The signature is timestamped: Wed May 06 13:51:06 2015
Timestamp Verified by:
    Issued to: GlobalSign Root CA
    Issued by: GlobalSign Root CA
    Expires:   Fri Jan 28 22:00:00 2028
    SHA1 hash: B1BC...829C

        Issued to: GlobalSign Timestamping CA - G2
        Issued by: GlobalSign Root CA
        Expires:   Fri Jan 28 22:00:00 2028
        SHA1 hash: C0E4...5B71

            Issued to: GlobalSign TSA for Standard - G2
            Issued by: GlobalSign Timestamping CA - G2
            Expires:   Tue Mar 03 10:00:00 2026
            SHA1 hash: 19E1...65B6


Successfully verified: CertificateCheck.exe

Number of signatures successfully Verified: 2
Number of warnings: 0
Number of errors: 0

Мы также дважды подписываем наши файлы ClickOnce .application и .manifest, используя комбинацию Mage.exe и SignTool.exe, но SignTool Verify, похоже, не работает с файлами .application и .manifest:

c:signtool.exe verify /all /pa /v CertificateCheck.application

Verifying: CertificateCheck.application
SignTool Error: This file format cannot be verified because it is not recognized.

Number of signatures successfully Verified: 0
Number of warnings: 0
Number of errors: 1

c:signtool.exe verify /all /pa /v CertificateCheck.exe.manifest

Verifying: CertificateCheck.exe.manifest
SignTool Error: This file format cannot be verified because it is not recognized.

Number of signatures successfully Verified: 0
Number of warnings: 0
Number of errors: 1

Мы можем открыть файлы .manifest и .application в редакторе с поддержкой XML, чтобы увидеть, что подписи в кодировке base64 действительно были добавлены, но есть ли эквивалент SignTool Verify, который позволяет мне видеть прикрепленные подписи и / или цепочки доверия сертификатов из командной строки? Или я просто неправильно вожу? Я хотел бы сделать это, чтобы мы могли добавить этап тестирования в наши сценарии сборки.

Дополнительная информация ...

Хорошо, похоже, это проблема, связанная с версией.

Я собрал несколько разных версий SignTool, чтобы попробовать разные вещи. В серии v5 были различные переключатели Verify / manifest, тогда как в серии v6, с которой я столкнулся, их нет. С другой стороны, серия v6 поддерживает сертификаты и алгоритмы SHA2, тогда как серия v5 не особо их любит.

Используя signtool.exe v5.2.3790.2568, я могу проверить строгое имя (идентификатор приложения) следующим образом:

signtool verify /manifest /snonly /v CertificateChecker.application
Successfully verified: CertificateChecker.application

Number of files successfully Verified: 1
Number of warnings: 0
Number of errors: 0

Но если я попытаюсь показать цепочку доверия сертификатов (и в ней есть сертификат SHA256), произойдет ошибка:

signtool verify /manifest /pa /v CertificateChecker.application
SignTool Error: CryptVerifyManifestFile returned error: 0x800B0004
        The subject is not trusted for the specified action.
Signing Certificate Chain:
    Issued to: GlobalSign
    Issued by: GlobalSign
    Expires:   2029-03-18 8:00:00 PM
    SHA1 hash: D69B...76AD

        Issued to: GlobalSign CodeSigning CA - SHA256 - G2
        Issued by: GlobalSign
        Expires:   2019-08-02 8:00:00 PM
        SHA1 hash: 4E34...A36FF

            Issued to: Example Pty Ltd
            Issued by: GlobalSign CodeSigning CA - SHA256 - G2
            Expires:   2018-05-11 2:17:24 AM
            SHA1 hash: 0961...A35D2

File is not timestamped.
SignTool Error: File not valid: CertificateChecker.application

Number of files successfully Verified: 0
Number of warnings: 0
Number of errors: 1

Итак, у меня остался вариант моего исходного вопроса: есть ли SignTool Verify, заменяющий файлы ClickOnce .application и .manifest ... и поддерживающий SHA256?


person AlwaysLearning    schedule 06.05.2015    source источник


Ответы (3)


mage.exe Инструмент создания и редактирования манифеста

mage -s CertificateCheck.application

Я пока не знаю, как проверить это через интерфейс командной строки.

person Remus Rusanu    schedule 05.04.2016

Используйте этот код для проверки манифестов ClickOnce:

// based on tip from http://www.pcreview.co.uk/threads/tool-for-clickonce-maifest-and-application-signature-validation.3308405/#post-11299058
private static ManifestSignatureInformationCollection GetClickOnceManifestSignature(string manifestPath)
{
    bool isApplicationManifest;
    if (manifestPath.EndsWith(".exe.manifest"))
    {
        isApplicationManifest = true;
    }
    else if (manifestPath.EndsWith(".application"))
    {
        isApplicationManifest = false;
    }
    else
    {
        throw new InvalidOperationException("Unrecognized manifest type, expected either application manifest (.exe.manifest) or deployment manifest (.application)");
    }

    XmlNamespaceManager namespaceManager = new XmlNamespaceManager(new NameTable());
    namespaceManager.AddNamespace("asmv1", "urn:schemas-microsoft-com:asm.v1");

    XElement assemblyIdentityXml = XDocument.Load(manifestPath).XPathSelectElement("/asmv1:assembly/asmv1:assemblyIdentity", namespaceManager);

    string applicationIdentityPart = string.Format(
        "{0}, Version={1}, Culture={2}, PublicKeyToken={3}, processorArchitecture={4}",
        assemblyIdentityXml.Attribute("name").Value,
        assemblyIdentityXml.Attribute("version").Value,
        assemblyIdentityXml.Attribute("language").Value,
        assemblyIdentityXml.Attribute("publicKeyToken").Value,
        assemblyIdentityXml.Attribute("processorArchitecture").Value);
    if (isApplicationManifest)
    {
        applicationIdentityPart += ", type=" + assemblyIdentityXml.Attribute("type").Value;
    }

    return ManifestSignatureInformation.VerifySignature(
        ActivationContext.CreatePartialActivationContext(new ApplicationIdentity(applicationIdentityPart + "/" + applicationIdentityPart),
            new[] { manifestPath, manifestPath }),
        isApplicationManifest ? ManifestKinds.Application : ManifestKinds.Deployment);
}


private static void Main(string[] args)
{
    ManifestSignatureInformationCollection resultDeployment = GetClickOnceManifestSignature(@"path\to\DeploymentManifest.application");
    ManifestSignatureInformationCollection resultApplication = GetClickOnceManifestSignature(@"path\to\ApplicationManifest.exe.manifest");

    Console.WriteLine("Deployment manifest is trusted: ");
    Console.WriteLine(resultDeployment[0].AuthenticodeSignature.TrustStatus == TrustStatus.KnownIdentity || resultDeployment[0].AuthenticodeSignature.TrustStatus == TrustStatus.Trusted);

    Console.WriteLine("Application manifest is trusted: ");
    Console.WriteLine(resultApplication[0].AuthenticodeSignature.TrustStatus == TrustStatus.KnownIdentity || resultApplication[0].AuthenticodeSignature.TrustStatus == TrustStatus.Trusted);
}
person Rafał Kłys    schedule 26.04.2016

Не то, что я знаю из. Идиотизм Microsoft до сих пор иногда меня поражает.

Старый signtool.exes не поддерживает SHA256. Новые версии поддерживают, но не поддерживают подписание манифестов (какого черта M $ удалил эту функцию ?!). mage.exe не поддерживает серверы сертификатов HSM, если вы не знаете закрытый ключ (в этом весь смысл использования таких серверов для защиты сертификатов). Это действительно потрясающе.

person Joe Coder    schedule 27.01.2016
comment
Итак, если я правильно понял, невозможно создать установщик приложения ClickOnce, подписанный аппаратным модулем безопасности (HSM)? - person Eric Hewitt; 04.04.2017