Экспорт сертификата в кодировке BASE-64.ССВ
Я пытаюсь экспортировать сертификат без закрытого ключа как файл в кодировке BASE-64, так же, как экспортировать его из windows. При экспорте из windows я могу открыть .файл cer в блокноте.
когда я пробую следующее и открываю в блокноте, я получаю двоичные данные...Думаю, да...нечитаемый.
X509Certificate2 cert = new X509Certificate2("c:myCert.pfx", "test", X509KeyStorageFlags.Exportable);
File.WriteAllBytes("c:testcer.cer", cert.Export(X509ContentType.Cert));
Я попытался удалить ' X509KeyStorageFlags.Exportable", но это не работает. Я что-то упускаю?
Edit-I пробовал
File.WriteAllText("c:testcer.cer",Convert.ToBase64String(cert.Export(X509ContentType.Cert)))
и это, кажется, работает, однако, отсутствует "- - - - - начать сертификат - - - - - - " и " - - - - - конечный сертификат - - - - - -"
4 ответов
возможно
/// <summary>
/// Export a certificate to a PEM format string
/// </summary>
/// <param name="cert">The certificate to export</param>
/// <returns>A PEM encoded string</returns>
public static string ExportToPEM(X509Certificate cert)
{
StringBuilder builder = new StringBuilder();
builder.AppendLine("-----BEGIN CERTIFICATE-----");
builder.AppendLine(Convert.ToBase64String(cert.Export(X509ContentType.Cert), Base64FormattingOptions.InsertLineBreaks));
builder.AppendLine("-----END CERTIFICATE-----");
return builder.ToString();
}
попробуйте это:
X509Certificate2 cerifikata = new X509Certificate2("C://certificate.pfx");
File.WriteAllBytes("D://Test.cer",cerifikata.Export(X509ContentType.Cert));
для тех, кто реализует что-то подобное в .NET Core, вот код, основанный на том, что сделал tyranid. Base64FormattingOptions.InsertLineBreaks не существует в .NET Core, поэтому мне пришлось реализовать свой собственный способ разрыва строки.
// Certificates content has 64 characters per lines
private const int MaxCharactersPerLine = 64;
/// <summary>
/// Export a certificate to a PEM format string
/// </summary>
/// <param name="cert">The certificate to export</param>
/// <returns>A PEM encoded string</returns>
public static string ExportToPem(this X509Certificate2 cert)
{
var builder = new StringBuilder();
var certContentBase64 = Convert.ToBase64String(cert.Export(X509ContentType.Cert));
// Calculates the max number of lines this certificate will take.
var certMaxNbrLines = Math.Ceiling((double)certContentBase64.Length / MaxCharactersPerLine);
builder.AppendLine("-----BEGIN CERTIFICATE-----");
for (var index = 0; index < certMaxNbrLines; index++)
{
var maxSubstringLength = index * MaxCharactersPerLine + MaxCharactersPerLine > certContentBase64.Length
? certContentBase64.Length - index * MaxCharactersPerLine
: MaxCharactersPerLine;
builder.AppendLine(certContentBase64.Substring(index * MaxCharactersPerLine, maxSubstringLength));
}
builder.AppendLine("-----END CERTIFICATE-----");
return builder.ToString();
}
/ / тем не менее, отсутствует "-----начать сертификат-----" и "-----конечный сертификат-----"
эти строки не являются обязательными. CA может генерировать их или нет в зависимости от настроек. По всем практическим причинам они могут быть удалены из файла Base64 encoded.