使用私钥Export-Clixml

时间:2018-08-02 00:47:12

标签: powershell certificate x509certificate

我正在尝试从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文件中提取客户端身份验证。

2 个答案:

答案 0 :(得分:1)

私有密钥不是X509Certificate2对象的一部分,因此不会与公共证书一起导出。私钥链接到公共证书。

要导出带有私钥的证书,您必须先对证书和私钥对象进行序列化,然后再将其传递给Export-CliXml

使用X509Certificate2.Export(X509Content​Type, Secure​String)方法将带有关联私钥的证书导出到PFX(PKCS#12容器)。私钥材料受密码保护。

在调用X509Certificate2.Import(Byte[], Secure​String, X509Key​Storage​Flags) 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