我可以将 X509 证书转换为字符串/字节以供以后使用吗?



我遇到需要 X509 证书的情况,并且有简单的方法将字符串传递给它。我可以以某种方式将证书转换为字符串并返回证书吗?

我尝试了以下方法,除了证书指纹已更改外,一切正常。

var originalCert = new X509Certificate2("C:\cert.pfx", "password");
var byteCert = originalCert.GetRawCertData();
var stringCert = Encoding.Unicode.GetString(byteCert);
var convertedBytes = Encoding.Unicode.GetBytes(stringCert);
var convertedCert = new X509Certificate2(convertedBytes);
var equalThumbprints = originalCert.Thumbprint == convertedCert.Thumbprint; //this returns false

在这种情况下,我如何获得完全相同的证书?

证书指纹不应该是唯一的,并且不应该由证书颁发机构生成吗?

如注释中所建议的,当您需要通过文本传输传输字节数组并保持其完整性时,您应该使用 Base64 编码:

String b64 = Convert.ToBase64String(originalCert.RawData);

然后当你需要从字符串恢复字节数组时:

Byte[] rawData = Convert.FromBase64String(b64);

Base64 仅使用 ASCII 表(实际上只有 7 位(,并且能够抵抗控制字符,例如 CR/LF/CRLF、空格、制表符和其他字符。

要回答指纹上的疑问,答案如下:

指纹是使用 SHA1 算法动态生成的,并且 在证书中实际不存在。由于指纹是 证书的唯一值,通常用于查找 证书存储中的特定证书。

更多在这里...

要检查您是否具有相同的证书,请使用Equals方法。

var equalcerts = originalCert.Equals(convertedCert);

更新

在比较 的证书时,不应使用 Equals 方法 安全目的。相反,请使用 RawData 属性的哈希,或 指纹属性。

因此,使用 RawData 创建新证书,如下所示:

var originalCert = new X509Certificate2("C:\cert.pfx", "password");
var byteCert = Convert.ToBase64String(originalCert.RawData);            
var convertedCert = new X509Certificate2(Convert.FromBase64String(byteCert));            
var equalThumbprints = originalCert.Thumbprint == convertedCert.Thumbprint; //true
var equalcerts = originalCert.Equals(convertedCert); //true

最新更新