PRB: X509Certificate admite sólo los certificados DER codificado

Exención de responsabilidades de contenido KB retirado

Este artículo se refiere a productos para los que Microsoft ya no ofrece soporte técnico. Por tanto, el presente artículo se ofrece "tal cual" y no será actualizado.

En este artículo se refiere a los siguientes espacios de nombres de biblioteca de clases de Microsoft.NET Framework:
  • System.IO
  • System.Security.Cryptography.X509Certificates
  • System.Text

Síntomas

Cuando se utiliza la clase System.Security.Cryptography.X509Certificates.X509Certificate , recibirá el siguiente mensaje de error:
No se pueden codificar los datos de entrada como un certificado válido.
Este problema se produce si se cumple alguna de las condiciones siguientes:
  • Utilice el constructor X509Certificate y pasar una matriz de bytes que se leen desde un archivo codificado en Base64 X.509 (.cer) al constructor X509Certificate . - o -

  • Utilice el método X509Certificate.CreateFromCertFile y pase la ruta de acceso a un archivo codificado en Base64 X.509 (.cer).

Causa

Este problema se produce porque la clase X509Certificate sólo admite certificados X.509 (.cer) binarios codificados en DER Distinguished Encoding Rules ().

Solución

Si el certificado codificado en Base64, siga estos pasos para resolver este problema:
  1. Quite las siguientes cadenas de los datos del certificado:
    -----BEGIN CERTIFICATE-----
    -----END CERTIFICATE-----

  2. Descodificar los datos de certificado Base64. Por ejemplo, el siguiente código de ejemplo de Visual C# descodifica los datos de certificado Base64:
    using System;using System.IO;
    using System.Security.Cryptography.X509Certificates;
    using System.Text;

    namespace ReadBase64Cert
    {
    public class ReadBase64Cert
    {
    public ReadBase64Cert()
    {
    }
    public static void Main(string[] args)
    {
    if (args.Length < 1)
    {
    Console.WriteLine("Usage: Base64EncodedFile (.cer)\n");
    return;
    }

    // args[0] - Base64Encoded .cer file

    // Open the certificate, and read it into a byte array.
    FileStream certFile = new FileStream(args[0],
    FileMode.Open,
    FileAccess.Read);
    int size = (int)certFile.Length;
    byte[] certBytes = new byte[size];
    size = certFile.Read(certBytes, 0, size);
    certFile.Close();

    // Remove the unnecessary characters.
    String certString = Encoding.ASCII.GetString(certBytes);
    StringBuilder sb = new StringBuilder(certString);
    sb.Replace("-----BEGIN CERTIFICATE-----", "");
    sb.Replace("-----END CERTIFICATE-----", "");

    // Decode the bytes from base64 to raw bytes.
    certBytes = Convert.FromBase64String(sb.ToString());
    X509Certificate cert = new X509Certificate(certBytes);
    Console.WriteLine(cert.GetName());
    }
    }
    }

Estado

Este comportamiento es por diseño.
Propiedades

Id. de artículo: 318217 - Última revisión: 17 ene. 2017 - Revisión: 1

Comentarios