我在localmachine的根证书存储中插入带有私钥的新CA证书时遇到问题.
这是发生的事情:
//This doesn't help either.
new StorePermission (PermissionState.Unrestricted) { Flags = StorePermissionFlags.AddToStore }.Assert();
var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
privkey.PersistKeyInCsp = true;
//This shouldn't be necessary doesn't make a difference what so ever.
RSACryptoServiceProvider.UseMachineKeyStore = true;
cert.PrivateKey = privkey;
store.Open (OpenFlags.MaxAllowed);
store.Add (cert);
store.Close ();
Run Code Online (Sandbox Code Playgroud)
证书被插入,它看起来都很花哨:(见!) 
注意:据说它有一个私钥.
所以你会说用FindPrivateKey可以找到它
C:\Users\Administrator\Desktop>FindPrivateKey.exe Root LocalMachine -t "54 11 b1 f4 31 99 19 d3 5a f0 5f 01 95 fc aa 6f 71 12 13 eb"
FindPrivateKey failed for the following …Run Code Online (Sandbox Code Playgroud) 我正在尝试在C#应用程序中使用HttpListener类来让迷你Web服务器通过SSL提供内容.为此,我需要使用httpcfg工具.我有一个带有公钥和私钥对的.pfx文件.如果我使用mmc手动将此密钥对导入本地机器商店,一切正常.但是,如果我使用X509Store类以编程方式导入此密钥对,则无法连接到我的迷你网络服务器.请注意,在这两种方法中,证书都会导入到LocalMachine中的MY商店.奇怪的是,一旦我以编程方式导入它,我就可以在mmc中查看证书,当我查看它时,UI表明私钥也可用于此证书.
深入挖掘,我注意到当我手动导入密钥对时,我可以看到一个新文件出现C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys,但是当我以编程方式导入时,不会出现一个.在相关的说明中,当我删除手动导入的证书时,它不会从前面提到的目录中删除相应的私钥文件.
最后,我的问题是:当我以编程方式将证书添加到商店时,存储的私钥在哪里以及为什么HttpListener类(HttpApi)无法访问它?
请注意,这个问题略有关联,但我不认为权限是问题,因为这一切都是作为同一个Windows用户完成的: 如何从.NET设置X.509证书的私钥文件的读取权限
我想我和这个人有同样的问题,但我没有他/她那么幸运,因为提供的解决方案对我不起作用.
提供的解决方案在C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys(不在C:\Users\[Username]\AppData\Roaming\Microsoft\Crypto\RSA子目录中)和(和子目录)中查找文件但是由于我希望安装程序将应用程序安装到所有用户,因此自定义操作在SYSTEM-User 下运行,这导致实际创建的文件在C:\ProgramData\Application Data\Microsoft\Crypto\RSA\S-1-5-18.
当以管理员(右键单击 - >运行为管理员)运行"普通"应用程序执行完全相同的代码时,将创建一个文件C:\Users\[Username]\AppData\Roaming\Microsoft\Crypto\RSA\S-1-5-21-1154405193-2177794320-4133247715-1000.
使用WIX自定义操作生成的证书似乎没有私钥(" 密钥集不存在 "),而"正常"应用程序生成的证书具有.
当在文件的权限来看,他们似乎是好的,即使它们不同(工作一个不包括SYSTEM用户),即使添加了后SYSTEM一个的("非工作")的文件,我无法阅读私钥,这里也是一样的错误.
然后我用了FindPrivateKey UTIL中找到相应的文件,但我得到的是"Unable to obtain private key file name".
好的,这里有什么?Windows在哪里存储SYSTEM用户存储的证书的私钥?也许没有创建任何私钥文件?为什么?
我在MSMQ服务个人存储中有证书,我需要授予网络服务访问证书的权限.
我知道这样做的唯一方法是使用win2008/7上的certutil.exe,如下所示:
certutil -service -service -repairstore MSMQ\My "" D:PAI(A;;GA;;;BA)(A;;GA;;;SY)(A;;GR;;;NS)
Run Code Online (Sandbox Code Playgroud)
但是,win2003/XP上的certutil无法识别-service参数,所以没有好处.
我的问题是如何以适合Win2003/XP和Win2008/7的方式实现?
我需要一种非交互式方法(命令行实用程序,脚本,COM/.NET/Win32 API).
我正在尝试从powershell脚本中找到一种授予私钥权限的方法.证书存储在CNG中.欢迎所有想法.
在连接到域的 Windows Server 2012 R2 机器上,我正在运行以下语句:
$target_machine_fqdn = [System.Net.Dns]::GetHostByName($env:computerName)
$certificate_request = Get-Certificate `
-Template 'AcmeComputer' `
-DnsName $target_machine_fqdn `
-CertStoreLocation 'Cert:\LocalMachine\My'
Run Code Online (Sandbox Code Playgroud)
我正在向域的 CA 请求主机证书。该语句返回没有错误。为机器生成证书并根据要求将其放置在“Cert:\LocalMachine\My”中。
问题:我不知道如何向服务帐户授予证书私钥的权限。
现在,大约有 1,000篇文章通过检索UniqueKeyContainerName以如下开头的代码来指导人们如何授予权限:
$certificate.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
Run Code Online (Sandbox Code Playgroud)
这在这里行不通。虽然证书有私钥,但私钥数据成员为空:

在我刚刚逃避的解决方案有效的情况下,私钥在文件系统上。但是,在这种情况下,私钥位于以下注册表中:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\SystemCertificates\MY\Keys
Run Code Online (Sandbox Code Playgroud)
使用证书 MMC-snapin 时,我可以看到证书。我可以管理私钥的权限。所以,我知道它在那里。不幸的是,我需要自动分配权限,因此不能选择使用证书 MMC-snapin。我需要通过 Powershell 以某种方式执行此操作。
c# ×3
certificate ×3
powershell ×2
windows ×2
.net ×1
.net-4.0 ×1
bouncycastle ×1
cng ×1
cryptography ×1
private-key ×1
security ×1
ssl ×1
uac ×1