Si alguna vez habéis intentado sacar los certificados por almacén, es posible que hayáis tenido problemas al mostrar el almacén CertificateAuthority en concreto.
Para sacar el listado de certificados yo hacía lo siguiente:
private Array listaDeAlmacenes()
{
return Enum.GetNames(typeof(StoreName));
}
private IList certificadosPorAlmacen(string almacen)
{
IList listaCertf = new List();
try
{
X509Store store = new X509Store(almacen, StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly);
X509Certificate2Collection collection = (X509Certificate2Collection)store.Certificates;
foreach (X509Certificate2 certificado in collection)
{
….. (etc)
listadeAlmacenes() devuelve en este caso, un array de strings de 8 elementos:
[0]: "AddressBook"
[1]: "AuthRoot"
[2]: "CertificateAuthority"
[3]: "Disallowed"
[4]: "My"
[5]: "Root"
[6]: "TrustedPeople"
[7]: "TrustedPublisher"
Cada una de estas cadenas se pasan al método certificadosPorAlmacén() y todo funciona bien exceptuando el caso de CertificateAuthority que no devolvía nada.
La solución la encontré rascando por internet y concretamente en: http://www.koders.com/csharp/fid7DCF8CE37E137FCC9549AD6DC0FCB4BEA690F50F.aspx
Este enlace nos lleva a la clase Mono.Security.X509 donde podemos ver el desarrollo que se ha hecho de la clase similar de Microsoft.
Este enlace nos lleva a la clase Mono.Security.X509 donde podemos ver el desarrollo que se ha hecho de la clase similar de Microsoft.
Me llamó la atención este método:
private static string StoreNameToString (StoreName sn)
{
switch (sn) {
case StoreName.CertificateAuthority:
return "CA";
default:
return sn.ToString ();
}
}
Pues bien, aquí está la solución: solamente hace falta cambiar el nombre de "CertificateAuthority" a "CA" para que funcione.
Sabiendo esto, cambié mi método de la siguiente forma:
private List listaDeAlmacenes()
{
List lista=new List();
foreach (string sn in Enum.GetNames(typeof(StoreName)))
{
lista.Add(sn);
}
//Aquí se realiza el cambio
lista[Array.IndexOf(lista.ToArray(), "CertificateAuthority")] = "CA";
/* También valdría:
*
lista = Enumerable.Union(
lista.Where(p => p != "CertificateAuthority"),
Enumerable.Repeat("CA", 1)).
ToList();
*/
/* Y también:
if (lista.Contains("CertificateAuthority"))
{
lista.Remove("CertificateAuthority");
lista.Add("CA");
}
*/
return lista;
}
No hay comentarios:
Publicar un comentario