【问题标题】:Silently deleting a certificate from Windows Root Store从 Windows 根存储区静默删除证书
【发布时间】:2014-10-16 04:37:14
【问题描述】:

我正在尝试使用 WinCrypt API 函数从 Root 存储中删除证书,如下所示:

HANDLE hStoreHandle = INVALID_HANDLE_VALUE;
PCCERT_CONTEXT pCertContext = NULL;
char * pszStoreName = "ROOT";
char pszNameString[256];

//hStoreHandle = CertOpenSystemStoreA(NULL, pszStoreName);

hStoreHandle = CertOpenStore(CERT_STORE_PROV_SYSTEM,
        X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
        0,
        CERT_SYSTEM_STORE_CURRENT_USER,
        (LPVOID) L"Root");

if(hStoreHandle == INVALID_HANDLE_VALUE)
        //Fail

while(pCertContext = CertEnumCertificatesInStore(hStoreHandle, pCertContext))
{
    if(CertGetNameStringA(   
        pCertContext,   
        CERT_NAME_SIMPLE_DISPLAY_TYPE,   
        0,
        NULL,   
        pszNameString,   
        256))
    {
        if(strcmp(pszNameString, "DummyCertificate") == 0)
        {
            if(!CertDeleteCertificateFromStore(
                CertDuplicateCertificateContext(pCertContext))
                )   
            {
                //Fail
            }
        }
    }
    else
    {
        //Fail
    }
}

这发生在当我的应用程序 Windows 服务 注册到 MyService.exe /Service 时调用的函数中。因此,理论上,它应该具有删除证书所需的所有必要访问权限。但是,当调用CertDeleteCertificateFromStore 函数时,会出现一个弹出窗口,询问用户是否真的要删除证书。

我正在尝试阻止此窗口出现并在找到证书时静默删除该证书。有什么建议吗?

我查看了命令行实用程序 certutilcertmgr。据我从互联网上了解到,certutil 在客户端计算机上有些限制,certmgr 不允许删除根证书。我想要一个程序化的解决方案,但如果它可以完成工作,我可以使用工具。

【问题讨论】:

    标签: c++ windows windows-services certificate


    【解决方案1】:

    您可以通过程序自动回答对话框来进行破解。尝试在另一个线程中找到与对话框关联的按钮窗口并发布消息以在“是”按钮上生成 BN_CLICKED 事件。

    【讨论】:

    • 在较慢(较旧)的系统上,它不会导致在事件触发之前绘制窗口吗?我真的不希望窗口以任何方式出现。
    • 大部分驱动软件使用这种方法来隐藏“驱动未签名”对话框。虽然窗口可能会立即出现和消失,但效果很好。
    • 我会试一试,但我会让这个问题开放几天。如果可行,我会接受你的回答。
    • 我会说这是一件非常不道德的事情。人们喜欢控制系统的安全关键部分。有一个 UI 提示是有原因的
    • 隐藏敏感提示不能成为好人。您可以预先要求提升权限,但这可能会给您足够的权限
    【解决方案2】:
    CERT_SYSTEM_STORE_CURRENT_USER->CERT_SYSTEM_STORE_LOCAL_MACHINE
    

    【讨论】:

    • 您能否提供一些上下文来说明您的答案如何用于解决问题?没有解释的一行文字不能提供好的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 2016-03-13
    • 2021-03-21
    • 2010-10-24
    • 2011-03-02
    • 1970-01-01
    • 2015-07-19
    相关资源
    最近更新 更多