冒充 X509Store.Add 到 StoreName.Root - 不支持请求

Impersonating to X509Store.Add to StoreName.Root - The Request Is Not Supported

我找不到与我遇到的错误相关的任何信息。

问题是我在下面的 store.Add 上遇到了 CryptographicException:

"The request is not supported."

MSDN Documentation 不是很有帮助,它指出:

The certificate could not be added to the store.

我以 为指导,进行了以下更改:

我的概念验证代码 (abridged/shoddy):

public class UserLogonImpersonator : IDisposable
{
    private WindowsImpersonationContext _impersonationContext = null;
    private const int LOGON_INTERACTIVE = 2;
    private const int PROVIDER_DEFAULT = 0;

    [DllImport("advapi32.dll", SetLastError=true)]
        private static extern int LogonUser(
        string lpszUserName,
        string lpszDomain,
        string lpszPassword,
        int dwLogonType,
        int dwLogonProvider,
        ref IntPtr phToken);

    public UserLogonImpersonator()
    {
        _impersonationContext = null;
        IntPtr userHandle = IntPtr.Zero;
        const string domain = "domain";
        const string user = "user";
        const string hcpw = "password";

        try
        {
            int logonResult = LogonUser(user, domain, hcpw, 
                LOGON_INTERACTIVE, PROVIDER_DEFAULT, ref userHandle);
            bool isLoggedOn = logonResult != 0;

            if (isLoggedOn)
            {
                _impersonationContext = 
                    WindowsIdentity.Impersonate(userHandle);
            }

        }
        catch(Exception e)
        {
            // Handle Exception
        }
    }

    public void Dispose()
    {
        // UndoImpersonation();
    }

    // Private methods ...
}

public class CertService
{
    public void AddCertToRootStore()
    {
        using(new UserLogonImpersonator())
        {
            X509Certificate2 rootCert = 
                new X509Certificate2(certData.CertFilePath);
            X509Store store = 
                new X509Store(StoreName.Root, StoreLocation.CurrentUser);
            store.Open(OpenFlags.MaxAllowed);
            store.Add(rootCert);
            store.Close();
        }
    }
}

我可以删除模拟并且不会抛出任何异常,但这不是正确的用户商店。

通过模拟,我可以毫无例外地将证书放入StoreName.AuthRoot。这不是我想要证书进入的商店。

这些无异常解决方案都不起作用。我要求该程序 运行 具有提升的权限并进入另一个用户的商店。

我手动解决了这个问题。

我想这样做是为了自动化 "test chain certificates." 我们的第三方 CA 给了我们一组 .local 域的证书。

我们的实际用例应该已经安装了根证书和链证书。