我正在处理将证书从服务器A导出到PFX的脚本,将其复制到服务器B并将PFX导入服务器。 我使用以下代码将密码从纯文本加密到安全字符串:
$pfxPass = "PassW0rd"
$File = "D:\backup_conf\Password.txt"
[Byte[]] $key = (1..16)
$pfxSecure = $pfxPass | ConvertTo-SecureString -AsPlainText -Force
$pfxSecure | ConvertFrom-SecureString -key $key | Out-File $File
dir Cert:\LocalMachine\my | Where-Object { $_.NotAfter -clike "*2019*"} | % { certutil.exe -f -exportPFX -p $pfxSecure $_.Thumbprint D:\backup_conf\certificates\$($_.Thumbprint).pfx }
创建了PFX,我可以看到Password.txt包含哈希字符串。 PFX和Password.txt被复制到新服务器上,我使用以下代码进行导入:
$file = "D:\backup_conf\Password.txt"
[Byte[]] $key = (1..16)
$pfxSecure = Get-Content $File | ConvertTo-SecureString -Key $key
$certs = (Get-ChildItem -recurse -Path "D:\backup_conf\certificates" -Include *.pfx)|%{Import-PfxCertificate $_.FullName -Exportable -Password $pfxSecure -CertStoreLocation Cert:\LocalMachine\My }
这个失败并出现错误:
Import-PfxCertificate:您尝试导入的PFX文件需要不同的密码或Active中的成员身份 受保护的目录主体。
知道它为什么不起作用吗?
答案 0 :(得分:1)
当您在SecureString
使用certutil.exe -f -exportPFX -p $pfxSecure
对象时certutil.exe
System.Security.SecureString
无法正确识别它。密码将按字面意思
SecureString
对于cmd应用程序,certutil.exe
不是它可以处理的内容,因此您必须将其转换为纯文本,然后将其传递给SecureString
。
示例如何将$SecurePassword = ConvertTo-SecureString $pfxPass
$BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword)
$UnsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
转换为纯文本(source):
flatMap