我正在尝试从PowerShell将一些对象存储为Clixml。
我可以成功存储阵列和证书,但私钥不会随其一起导出。
示例:
PS > $cert.HasPrivateKey
true
PS > $outObject = $array
PS > $outObject += $cert
PS > $outObject | Export-Clixml -Path .\file.xml
PS > $inObject = Import-Clixml -Path .\file.xml
PS > $newcert = $inObject | Where-Object { $_.GetType().Name -like "*X509Certificate2" }
PS > $newcert.HasPrivateKey
false
我注意到$cert.PrivateKey
有一种方法:
ExportParameters Method System.Security.Cryptography.RSAParameters ExportParameters(bool includePrivateParameters)
此脚本未在Windows中专门运行,并且证书未安装在CABI存储中,仅安装了从Get-PfxCertificate
导入的变量。
长话短说,我正在构建一个使用客户端身份验证连接到API的模块。我正在尝试从Clixml文件中提取客户端身份验证。
答案 0 :(得分:1)
私有密钥不是X509Certificate2
对象的一部分,因此不会与公共证书一起导出。私钥链接到公共证书。
要导出带有私钥的证书,您必须先对证书和私钥对象进行序列化,然后再将其传递给Export-CliXml
。
使用X509Certificate2.Export(X509ContentType, SecureString)
方法将带有关联私钥的证书导出到PFX(PKCS#12容器)。私钥材料受密码保护。
在调用X509Certificate2.Import(Byte[], SecureString, X509KeyStorageFlags)
cmdlet之后,使用Import-CliXml
方法导入证书和关联的私钥。
这是您唯一的选择。另外,请注意,此方法仅在私钥可导出时才有效。如果私钥不可导出,则Export
方法将失败。
答案 1 :(得分:0)
通过将证书对象转换为PFX格式(由Crypt32建议)并将对象保存在哈希表中,我能够成功导出和导入具有私钥的数组和证书。
PS > $cert.HasPrivateKey
true
PS > $pfx = $cert.Export([System.Security.Cryptography.X509Certificates.X509ContentType]::Pfx,'Pa$$w0rd')
PS > $outObject = @{
>> myArray = $array
>> myCert = $pfx
>> }
PS > Export-Clixml -InputObject $outObject -Path .\file.xml
PS > $inObject = Import-Clixml -Path .\file.xml
PS > $newCert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::New($inObject.myCert,'Pa$$w0rd')
PS > $newCert.HasPrivateKey
true