我使用 Visual Studio 开发人员命令提示符按以下方式创建了 PFX 证书;
makecert -r -pe -n "CN=mycert" -sky exchange "mycert.cer" -sv "mycert.pvk"
pvk2pfx -pvk "mycert.pvk" -spc "mycert.cer" -pfx "mycert.pfx" -pi [password]
然后我使用 PowerShell 来查询证书
$cert = Get-PfxCertificate [Location]
$cert.Verify()
# Returns 'False'
我如何获取此证书以用于加密?
更新
@root 建议使用Import-PfxCertificate
命令。这是我运行它时发生的情况。
Import-PfxCertificate -FilePath [Path]
Import-PfxCertificate : The PFX file you are trying to import requires either a different password or membership in an Active Directory principal to which it is protected.
At line:1 char:1
+ Import-PfxCertificate -FilePath [...]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Import-PfxCertificate], Win32Exception
+ FullyQualifiedErrorId : System.ComponentModel.Win32Exception,Microsoft.CertificateServices.Commands.Im
portPfxCertificate
进一步更新
@McDonald 建议使用一种安全的方法将密码传递给Import-PfxCertificate
命令。这是我尝试过的;
Import-PfxCertificate -FilePath [Path] -Password (Get-Credential).Password
$cert = dir cert:\localmachine\my | where { $_.Thumbprint -eq [Thumbprint] } | Select-Object
$cert.Verify()
仍然返回 false。还有其他线索吗?
答案1
这Verify
方法检查证书是否受信任。要确切了解验证失败的原因,我们需要构建链:
$cert = Get-PfxCertificate -FilePath .\mycert.pfx
$chain = New-Object System.Security.Cryptography.X509Certificates.X509Chain
$chain.Build($cert)
$chain.ChainStatus
当我重复你的步骤并运行这些命令时,我得到了地位的UntrustedRoot
。这意味着验证失败,因为证书不是由受信任的证书颁发机构签名的,考虑到我们是自行签名的(打开-r
),makecert
这是有道理的。
为了使证书验证,请将其导入受信任的根证书颁发机构存储区:
Import-PfxCertificate -CertStoreLocation Cert:\CurrentUser\Root -FilePath .\testcert.pfx -Password (Read-Host 'Password' -AsSecureString)
输入 PFX 密码,接受大警告对话框,证书将被添加。然后验证将通过。如果您更喜欢 GUI,那么certmgr.msc
就可以了。
不过,即使证书不受计算机信任,您也可以使用 RSA 参数。假设数字 137 是发给私钥持有者的秘密消息。我们可以使用公钥来加密我们的消息:
$public = Get-PfxCertificate .\mycert.cer
$public.PublicKey.Key.Encrypt(@(137), $false)
然后,以某种方式,加密后的大字节数组(称之为$message
)到达私钥持有者,后者恢复原始数字:
$private = Get-PfxCertificate .\mycert.pfx
$private.PrivateKey.Decrypt($message)
通常是一些更有趣/更高级的东西(参见 MSDN) 将使用密钥完成。关键是,应用程序可以使用证书,而无需计算机信任它。
答案2
我接受了@BenN 的回答,因为这是真正的解决方案。我想将我学到的东西整合成一个有凝聚力的过程,以便其他人可以轻松生成加密证书。
步骤 1:创建证书
$publicCert = New-SelfSignedCertificate -DnsName $dnsName `
-CertStoreLocation Cert:\LocalMachine\My
证书不受信任
$publicCert.Verify()
False
步骤 2:导出 PFX 证书
$cred = Get-Credential
Export-PfxCertificate -Cert $publicCert -FilePath $certPath -Password $cred.Password
步骤 3:在根证书存储区中安装证书
Import-PfxCertificate -FilePath $certPath -CertStoreLocation Cert:\CurrentUser\Root `
-Password $cred.Password
步骤 4:再次验证证书
$publicCert.Verify()
True
然后您可以按照@BenN 的说明了解如何使用证书执行解密。