首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用私钥导入证书

使用私钥导入证书
EN

Stack Overflow用户
提问于 2017-11-15 15:24:13
回答 1查看 3.8K关注 0票数 1

我试图导入一个带有私钥的证书,虽然我的脚本正在“工作”,但是缺少一些我似乎找不到的东西。

我有一个应用程序,它与KeyVault对话,并使用此证书进行授权。我有上述证书的密码,当我手动安装PFX以及分配NETWORK SERVICE帐户权限时,可以正常工作。但是,使用下面的PowerShell,我得到了错误Keyset does not exist。当我在证书经理下面检查这件事时,一切似乎都很正常。很明显,UI正在做一些不同的事情。有什么想法吗?

当我手动添加NETWORK SERVICE帐户时进行编辑--这很好。当我执行脚本时,PowerShell正在以管理模式运行,所以这可能有些奇怪吗?

脚本

代码语言:javascript
复制
cls
$certName = "certname.pfx"
$path = "C:\Certificates\$certName"
$serviceAccount = 'NETWORK SERVICE'
$permissionType = 'Read'
$password = 'somepassword'

try {
    # Import the certificate maintaining the private key format
    $cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
    $cert.Import($path, $password, [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"PersistKeySet")

    # Add the cert to personal store location
    $store = Get-Item Cert:\LocalMachine\My
    $store.Open([System.Security.Cryptography.X509Certificates.OpenFlags]"ReadWrite")
    $store.Add($cert)
    $store.Close()

    # Get SecurityIdentifier value from current username
    $currentUser = New-Object System.Security.Principal.NTAccount($env:USERNAME)
    $strSID = $currentUser.Translate([System.Security.Principal.SecurityIdentifier])
    $path = "$env:USERPROFILE\AppData\Roaming\Microsoft\Crypto\RSA\$($strSID.Value)\$($cert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName)"
    $acl = Get-Acl $path
    $rule = New-Object Security.AccessControl.FileSystemAccessRule $serviceAccount, 'FullControl', Allow
    $acl.AddAccessRule($rule)
    Set-Acl $path $acl

    Write-Host "Cert installed, press any key to continue" -ForegroundColor Green
    Read-Host
}
catch {
    Write-Error -Message $_
}

对于遇到与我相同问题的其他人,应答,只需提供多个存储标志:

代码语言:javascript
复制
$flags = @([System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"MachineKeySet", [System.Security.Cryptography.X509Certificates.X509KeyStorageFlags]"PersistKeySet")
$cert = New-Object System.Security.Cryptography.X509Certificates.X509Certificate2
$cert.Import($path, $password, $flags)
EN

回答 1

Stack Overflow用户

发布于 2017-11-15 15:48:02

您可能希望同时使用PersistKeySetMachineKeySet导入证书。看看你在这里是怎么做的

  • 打开PFX,而不指定用户vs机器KeySet
  • 将其添加到LocalMachine商店。
  • 在当前用户的SID下查找密钥文件。

Windows Cert存储区AFAIK不记录哪个用户拥有密钥,只记录此证书与"user key {id}“配对。因此,它需要是机器(共享)密钥存储。

"keyset不存在“是因为Network用户在密钥存储库中没有使用该ID命名的密钥。

因此,区别可能是UI断言MachineKeySet (等效),因为它知道您正在导入LocalMachine存储。

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

https://stackoverflow.com/questions/47311156

复制
相关文章

相似问题

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