首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Windows 2008 R2中私钥意外被删除

在Windows 2008 R2中私钥意外被删除
EN

Stack Overflow用户
提问于 2012-05-08 12:25:05
回答 3查看 9.4K关注 0票数 4

在开发安装过程中,我遇到了一个奇怪的问题,应该在其中一个步骤中安装证书。

该问题与授予证书对Windows 2008 R2上的帐户(例如R2)的私钥访问有关。私钥存储在位置C:\Users\All Users\Microsoft\Crypto\RSA\MachineKeys中。

自定义C#安装项目在安装过程中导入证书并允许访问证书私钥上的帐户。一段时间后(2-3秒),私钥文件将自动从MachineKeys文件夹中删除。因此,安装的Web应用程序无法访问特定的证书,并显示以下错误消息:

“System.Security.Cryptography.CryptographicException:密钥集不存在“。此错误仅在Windows 2008 R2上发生,而对于Windows 2003,一切都正常工作。

我的问题是,为什么私钥被删除,这是什么过程?

Thx

更新17/05/2012

我还没有找到所描述的问题的解决方案,也没有在我问过的其他论坛(forums.asp.net,social.msdn.microsoft.com)上发布任何回复。因此,有人能为进一步解决这个问题提出任何其他资源或建议吗?

再次感谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-10 20:51:05

这也发生在我身上--我的安装脚本会添加证书并授予对PK文件的访问权限,并且应用程序也会工作。然后,在我关闭了PowerShell编辑器之后,我重新启动了这个应用程序,它失败了,没有找到一个键集。

导入证书时添加PersistKeySet标志解决了问题。下面是用于添加带有持久性的证书和私钥的PowerShell代码:

代码语言:javascript
复制
param(
    [string]$certStore = "LocalMachine\TrustedPeople",
    [string]$filename = "sp.pfx",
    [string]$password = "password",
    [string]$username = "$Env:COMPUTERNAME\WebSiteUser"
)

    function getKeyUniqueName($cert) {
         return $cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
    }
    
    function getKeyFilePath($cert) {             
         return "$ENV:ProgramData\Microsoft\Crypto\RSA\MachineKeys\$(getKeyUniqueName($cert))"
    }

$certFromFile = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2($filename, $password)
$certFromStore = Get-ChildItem "Cert:\$certStore" | Where-Object {$_.Thumbprint -eq $certFromFile.Thumbprint}
$certExistsInStore = $certFromStore.Count -gt 0
$keyExists = $certExistsInStore -and ($certFromStore.PrivateKey -ne $null) -and (getKeyUniqueName($cert) -ne $null) -and (Test-Path(getKeyFilePath($certFromStore)))

if ((!$certExistsInStore) -or (!$keyExists)) {

    $keyFlags = [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::MachineKeySet 
    $keyFlags = $keyFlags -bor [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]::PersistKeySet
    $certFromFile.Import($filename, $password, $keyFlags)

    $store = Get-Item "Cert:\$certStore"
    $store.Open("ReadWrite")

    if ($certExistsInStore) {
        #Cert is in the store, but we have no persisted private key
        #Remove it so we can add the one we just imported with the key file
        $store.Remove($certFromStore)
    }

    $store.Add($certFromFile)
    $store.Close()

    $certFromStore = $certFromFile
    "Installed x509 certificate"
}

$pkFile = Get-Item(getKeyFilePath($certFromStore))
$pkAcl = $pkFile.GetAccessControl("Access")
$readPermission = $username,"Read","Allow"
$readAccessRule = new-object System.Security.AccessControl.FileSystemAccessRule $readPermission
$pkAcl.AddAccessRule($readAccessRule)
Set-Acl $pkFile.FullName $pkAcl
"Granted read permission on private key to web user"
票数 6
EN

Stack Overflow用户

发布于 2012-05-08 12:38:19

非常清楚,这是一个安全问题,“System.Security.”.。而且您没有执行安装的权限。您需要设置私钥上的权限以允许该服务帐户访问它

编辑稍后的:转到启动->Run->cmd->类型mmc->选择文件->添加/删除->选择证书->添加->计算机帐户->本地。我附上了一个西班牙语屏幕截图,但我指出了以下字段:

Open->Certificates->Personal->Certificates->Right单击证书->所有任务->管理私钥->添加网络服务。

也请检查这个条目,看看Windows 2008中这个特性是如何工作的。然后,请在您试用它之后,返回并告诉您是否可以用我告诉您的内容来解决这个问题。

票数 1
EN

Stack Overflow用户

发布于 2016-06-02 14:49:50

http://referencesource.microsoft.com/#System/security/system/security/cryptography/x509/x509certificate2collection.cs,256显示PersistKeySet标志的测试位置。PersistKeySet标志记录在https://msdn.microsoft.com/en-us/library/system.security.cryptography.x509certificates.x509keystorageflags%28v=vs.110%29.aspx上,其短语是“导入证书时与PFX文件关联的键被持久化”。我对英语翻译器说,这意味着“如果您调用PersistKeySet构造函数,并且证书可能已经安装在机器上,您必须包括X509Certificate2标志。”这可能也适用于.Import调用。很可能powershell已经这样做了。但是,如果您正在执行已被接受的答案所显示的内容或OP要求的内容,则需要包含特殊的键。我们在解决方案中使用了ejegg脚本的一个变体。我们有一个进程,每3分钟运行一次,以检查是否安装了所有配置的证书,并且现在似乎运行良好。

我们在powershell中看到的症状是HasPrivateKey属性是真的,但是PrivateKey值本身是空的。并删除了C:\ProgramData\Microsoft\Crypto\RSA\MachineKeys中证书的密钥文件。FindPrivateKey实用程序https://msdn.microsoft.com/en-us/library/aa717039(v=vs.110).aspx帮助我们删除了查看文件。

所以对这个问题的回答很晚,祝你4岁生日快乐。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10498580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档