我遇到需要 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