我可以使用EV证书手动签署.hlkx文件,以便在Microsoft网站

时间:2016-03-01 19:48:33

标签: driver windows-10 sys cab windows-dev-center

我已经使用Hardware Lab Kit中的usb设备完成了所有测试,现在可以准备.hlkx驱动程序包以在Microsoft网站上提交。

问题是Windows 10驱动程序需要EV证书。 EV证书随附Safenet USB令牌,此USB令牌远离安装了Hardware Lab Kit的计算机,因此我无法自动在Hardware Lab Kit中签署.hlkx包。

问题是如何让我的Windows 10 usb驱动程序签名?我有未签名的驱动程序(sys,cab,inf ...文件),我有来自Hardware Lab Kit的unsigned .hlkx驱动程序包。我可以在不提交微软网站的情况下签署我的驱动程序吗?

2 个答案:

答案 0 :(得分:1)

你可以

  1. 将HLK Studio安装到插有EV令牌的计算机上;
  2. 使用EV令牌将未签名的.hlkx文件复制到计算机;
  3. 当您从pt1启动HLK Studio时,它将提示打开.hlkx文件,指定它;
  4. 在HLK Studio的“包裹”选项卡上照常创建包。

答案 1 :(得分:0)

Alexey提供的答案对我不起作用,我最终使用了此页面的源代码:

https://msdn.microsoft.com/en-us/library/windows/hardware/mt674914%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

我不得不做一些额外的调整:

使用此功能之前,请确保EV证书位于个人证书存储区中。在您的USB令牌工具中,您应该能够打开证书并选择“安装证书”。

在visual studio中创建一个新的控制台应用程序并粘贴此源代码。 安装nugget包“WindowsBase”以获取System.IO.Packaging命名空间。

使用一些额外的源代码,我们可以使用它:

class Program
{
    static void Main(string[] args)
    {
        X509Store store = new X509Store("My");

        store.Open(OpenFlags.ReadOnly);
        X509Certificate2 evCert = null;
        foreach (X509Certificate2 mCert in store.Certificates)
        {
            if (mCert.Thumbprint == "3DF652D7EyourThumbprintF")
            {
                evCert = mCert;
            }
        }
        Sign(@"C:\Path\To\Your\HLKXFile.hlkx", evCert);
    }

    public static void Sign(string package, X509Certificate2 certificate)
    {
        // Open the package to sign it
        Package packageToSign = Package.Open(package);

        // Specify that the digital signature should exist 
        // embedded in the signature part
        PackageDigitalSignatureManager signatureManager = new PackageDigitalSignatureManager(packageToSign);

        signatureManager.CertificateOption = CertificateEmbeddingOption.InCertificatePart;

        // We want to sign every part in the package
        List<Uri> partsToSign = new List<Uri>();
        foreach (PackagePart part in packageToSign.GetParts())
        {
            partsToSign.Add(part.Uri);
        }

        // We will sign every relationship by type
        // This will mean the signature is invalidated if *anything* is modified in                           //the package post-signing
        List<PackageRelationshipSelector> relationshipSelectors = new List<PackageRelationshipSelector>();

        foreach (PackageRelationship relationship in packageToSign.GetRelationships())
        {
            relationshipSelectors.Add(new PackageRelationshipSelector(relationship.SourceUri, PackageRelationshipSelectorType.Type, relationship.RelationshipType));
        }

        try
        {
            signatureManager.Sign(partsToSign, certificate, relationshipSelectors);
        }
        finally
        {
            packageToSign.Close();
        }
    }
}

将指纹替换为EV证书SHA1。