【问题标题】:dpinst / DifX won't install signed driver silentlydpinst / DifX 不会静默安装签名的驱动程序
【发布时间】:2010-12-22 21:01:02
【问题描述】:

通过 DpInst 在 Windows 7 上安装签名驱动程序(即使用正确签名的 .CAB)时,除非它是 WHQL 签名驱动程序,否则您无法静默安装。如果您在非静默模式下运行 DpInst,它会提示您信任“发布者”。如果您在静默模式下运行 DpInst,它将失败并显示与签名相关的错误代码(类似于 0x800b0109 - 检查您的 setupapi.app.log)。

【问题讨论】:

    标签: windows-7 device-driver digital-signature setupapi driver-signing


    【解决方案1】:

    虽然 ilya 的回答很好,但在 Windows 7 上的解决方案更加简单。下面的命令将证书部署到当前用户和系统受信任的发布者证书存储。它需要管理权限,由 Microsoft 提供。

    对于 Windows 7

    certutil.exe -addstore TrustedPublisher cert.cer
    

    我验证这可以在 Windows 7 64 位上部署已签名但未经 WHQL 认证的驱动程序 - 无需提示用户。

    Windows XP

    WHQL 认证

    看来,在 XP 上,您仍然需要对驱动程序进行 WHQL 认证以避免安装提示。

    在 Windows XP 上预安装 SPC

    对于 Windows XP,您需要从 Microsoft 下载 Windows Server 2003 管理工具包并提取 certutil.exe 和 certadm.dll。那么上面的命令也可以在 XP 上运行。

    管理工具包:http://www.microsoft.com/download/en/details.aspx?DisplayLang=en&id=16770

    注意解压出来的msi文件可以用7-zip查看,所以不需要安装就可以得到你需要的exe和dll。

    【讨论】:

    • 其实这很优雅,因为 certutil.exe 似乎是随 Windows 7 提供的。(嗯,我的 System32 中有它,所以我认为它不是某些 SDK 或其他东西的一部分。)
    【解决方案2】:

    直接的方法是将签名证书添加到 TrustedPublishers。您可以通过编程方式完成(win32exception 的实现留给读者作为练习):

    #include <windows.h>
    #include <wincrypt.h>
    #include "win32exception.h"
    
    void InstallTrustedPublisherCertificate(LPCTSTR CertificateFilePath)
    {
        DWORD dwContentType;
        PCCERT_CONTEXT pCertContext = NULL;
        if (!CryptQueryObject(
                CERT_QUERY_OBJECT_FILE,
                CertificateFilePath,
                CERT_QUERY_CONTENT_FLAG_ALL,
                CERT_QUERY_FORMAT_FLAG_ALL,
                0,
                NULL,
                &dwContentType,
                NULL,
                NULL,
                NULL,
                (const void **)&pCertContext))
                throw win32exception("CryptQueryObject");
    
        if (dwContentType != CERT_QUERY_CONTENT_CERT)
            throw exception("Incorrect content type of crypto object.");
    
        __try
        {
            HCERTSTORE hCertStore = CertOpenStore(
                CERT_STORE_PROV_SYSTEM,
                0,
                0,
                CERT_STORE_OPEN_EXISTING_FLAG |
                CERT_SYSTEM_STORE_CURRENT_USER,
                _T("TrustedPublisher"));
            if (hCertStore == NULL)
                throw win32exception("CertOpenStore");
    
            __try
            {
                if (CertAddCertificateContextToStore(hCertStore, pCertContext, CERT_STORE_ADD_NEWER, NULL))
                {
                    // Added certificate to TrustedPublisher store.
                }
                else
                {
                    DWORD err = GetLastError();
                    if (err == CRYPT_E_EXISTS)
                    {
                        // Certificate already exists in TrustedPublisher store.
                    }
                    else
                        throw win32exception("CertAddCertificateContextToStore", err);
                }
            }
            __finally
            {
                CertCloseStore (hCertStore, 0);
            }
        }
        __finally
        {
            CertFreeCertificateContext(pCertContext);
        }
    }
    

    【讨论】:

    • 这个工作似乎是 Windows 中的一个安全漏洞,不是吗?
    • 这不是安全漏洞。当然,您应该能够修改自己的证书存储。如果您运行任意程序,它们可以代表您执行任意操作(只要您有权执行它们)。
    【解决方案3】:

    问题是?如果驱动程序未通过 WHQL 认证,则无法静默安装。这是 Windows 的一项安全措施。

    【讨论】:

    • 请注意,DpInst 允许您进一步安装同一发布者的驱动程序静默。它是如何做到的?当然,通过安装发布者的证书。
    • @Ilya 那么您可能在谈论与我不同的警告。警告类型取决于驱动程序类型。
    • @Eugene 我说的是这个警告——“这个驱动程序是由 XYZ 公司发布的。你信任 XYZ 公司吗?[x] 永远信任 XYZ 公司”。它不像未签名驱动程序的警告那么严重,但它仍然是一个警告 - 如果您使用 /silent 运行 DpInst 它将静默失败。
    • @Ilya 这是我所说的非认证驱动程序的显示。据我所知,只有通过实际获得 WHQL 认证才能避免这种情况。这是我们尚未采取的步骤。
    • @Ilya 感谢您的提示,但我不确定策略是否始终允许静默修改证书存储。然而,这是解决问题的一种有趣方式。
    【解决方案4】:

    驱动程序必须通过 WHQL 认证以避免任何类型的未签名弹出窗口。

    如果您正在寻找任何第三方 WHQLTesting 服务提供商,请告诉我们,我们很乐意在这方面为您提供帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 2010-12-07
      • 2017-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多