J'essaie d'exporter un certificat sans la clé privée en tant que fichier encodé BASE-64, comme pour l'exporter depuis Windows. Lorsqu'il est exporté à partir de Windows, je peux ouvrir le fichier .cer dans le bloc-notes.
Lorsque j'essaie ce qui suit et que je l'ouvre sur le bloc-notes, j'obtiens des données binaires ... Je pense qu'elles ne sont ... pas lisibles.
X509Certificate2 cert = new X509Certificate2("c:\\myCert.pfx", "test", X509KeyStorageFlags.Exportable);
File.WriteAllBytes("c:\\testcer.cer", cert.Export(X509ContentType.Cert));
J'ai essayé de supprimer le "X509KeyStorageFlags.Exportable" mais cela ne fonctionne pas. Suis-je en train de manquer quelque chose?
Modifier - j'ai essayé
File.WriteAllText("c:\\testcer.cer",Convert.ToBase64String(cert.Export(X509ContentType.Cert)))
et cela semble fonctionner, cependant, sans les "----- BEGIN CERTIFICATE -----" et "----- END CERTIFICATE -----"
Peut-être
/// <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();
}
essaye ça:
X509Certificate2 cerifikata = new X509Certificate2("C://certificate.pfx");
File.WriteAllBytes("D://Test.cer",cerifikata.Export(X509ContentType.Cert));
Pour ceux qui implémentent quelque chose de similaire dans .NET Core, voici le code, basé sur ce que tyranid a fait. Base64FormattingOptions.InsertLineBreaks n'existe pas dans .NET Core, j'ai donc dû implémenter ma propre façon de faire le saut de ligne.
// 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();
}
// cependant, il manque "----- BEGIN CERTIFICATE -----" et "----- END CERTIFICATE -----"
Ces lignes manquantes sont facultatives. CA peut les générer ou non en fonction des paramètres. Pour toutes raisons pratiques, ils peuvent être supprimés du fichier encodé en Base64.