2015-05-14 308 views
1

有人可以请帮我解决以下问题。 我使用PowerShell,到目前为止,我已经想出了如何获取X509证书平面文件,例如Cert.cer和音乐会它到一个Base64字符串的存储(例如在数据库中作为一个字符串等),然后再将其转换回System.Security.Cryptography.X509Certificates.X509Certificate2对象将base64字符串转换为X509 certifcate

请看我的代码如下远

$CertifcateFileFullPath = "C:\temp\cert.cer" 
$Cert = new-object security.cryptography.x509certificates.x509certificate2 -ArgumentList $CertifcateFileFullPath 

$Obj2 = [System.Convert]::ToBase64String($Cert.RawData) 

$Obj3 = [System.Security.Cryptography.X509Certificates.X509Certificate2]([System.Convert]::FromBase64String($Obj2)) 

现在的事情是我想写的对象$ OBJ 3回文件系统作为平面文件(如Cert.cer),这是可读/可作为原始凭证。如果我使用| out-file C:\ Temp2 \ Cert.cer等等...我得到的文件比原始文件大得多,不可读(例如,不能像普通的证书文件那样打开)。我认为编码是写出对象到文件系统时的问题(我相信证书文件是ASN 1编码二进制文件)

有人可以帮助我实现这一点,请提前致谢。

Ë布兰特

+0

上面的代码没有出来过好让我尝试粘贴再次$ CertifcateFileFullPath =“C:\ TEMP \ cert.cer” $证书=新对象security.cryptography.x509certificates.x509certificate2 -ArgumentList $ CertifcateFileFullPath $ OBJ2 = [System.Convert] :: ToBase64String($ Cert.RawData) $ OBJ3 = [System.Security.Cryptography.X509Certificates.X509Certificate2]([System.Convert] :: FromBase64String($ OBJ2)) – user2971567

回答

0

的问题是,PewrShell是Unicode默认,而解码器的CryptoAPI预计ASCII编码(其中每个字符使用一个字节编码)。要实现此目的,请将-Encoding ASCII参数添加到Out-File cmdlet。

顺便说一句,没有必要以二进制格式存储证书文件。 CryptoAPI支持Base64格式的证书文件。由于.NET依赖于CryptoAPI,所以不存在可互换性问题。

+0

非常感谢Vadims :) – user2971567

相关问题