我编写了一个脚本,它可以为我创建证书,并且应该使用另一个证书对所有证书进行签名。
$dnsNames = @("example.com", "example.org")
New-SelfSignedCertificate -CertStoreLocation Cert:\LocalMachine\My -DnsName $dnsNames -FriendlyName "Example Cert" -Signer Cert:\LocalMachine\Root\QWREEWRQ12123132QWEQWE123123
但是当我运行这个脚本时我收到错误消息CertEnroll::CSignerCertificate::Initialize:密钥不存在。0x8009000d(-2146893811 NTE_NO_KEY)。
私钥在证书存储区中可用,并且证书达到了客户端身份验证和服务器身份验证的预期目的。
是什么导致了此错误信息?
答案1
对于那些正在为此苦苦挣扎的人来说。
确保 Powershell 以管理员身份运行(这很关键)。
请记住,这仅适用于 Windows 10,如果您尝试在较旧的操作系统上使用 New_SelfSignedCertificate 命令,您会发现它已经过时并且不支持某些扩展参数,其中一些参数非常必要,例如具有 SAN 支持的 -DnsName 的多个值。当我想使用 SAN 通配符 (*.mydomain.com) 创建证书时,我个人甚至无法让它在 Server 2012 R2 上运行。只需坚持使用 Windows 10 上的版本,您就会没事 ;)
将您已经创建的根 CA(我假设您已经这样做了)分配给一个变量:
$rootcert = ( Get-ChildItem -Path cert:\LocalMachine\My\6980327922B448834C67547B20DB8F054326F140
现在将该变量传递到 New-SelfSignedCertificate 命令:
New-SelfSignedCertificate -DnsName MyDnsName,MyOtherDnsName -CertStoreLocation cert:\LocalMachine\My -Signer $rootcert -KeyUsage CertSign,CRLSign,DataEncipherment,DigitalSignature,KeyAgreement,KeyEncipherment -Type SSLServerAuthentication
上面的示例创建了一个 SSL 证书,但您可以通过为 -Type 变量设置不同的值来创建任何可用的类型。您还可以将 -KeyUsage 值更改为适当的值。请参阅此处的可选参数文档:
https://docs.microsoft.com/en-us/powershell/module/pkiclient/new-selfsignedcertificate?view=win10-ps
答案2
至少例子将路径括在引号中,此外,您的参数拼写错误(CertStoreLocaiton
而不是CertStoreLocation
)。此外,您可能必须使用-ExistingKey
开关。