冒充 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.
我以 为指导,进行了以下更改:
- 他们正在添加到 StoreName.My 并且 我想添加到
StoreName.Root
- 我想使用 IDisposable class 来模拟用户。
我的概念验证代码 (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 域的证书。
我们的实际用例应该已经安装了根证书和链证书。
我找不到与我遇到的错误相关的任何信息。
问题是我在下面的 store.Add
上遇到了 CryptographicException:
"The request is not supported."
MSDN Documentation 不是很有帮助,它指出:
The certificate could not be added to the store.
我以
- 他们正在添加到 StoreName.My 并且 我想添加到 StoreName.Root
- 我想使用 IDisposable class 来模拟用户。
我的概念验证代码 (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 域的证书。
我们的实际用例应该已经安装了根证书和链证书。