2008-11-21 14 views
7

Estoy escribiendo un servicio de Windows que necesita varios certificados en el almacén de certificados para conectarse a un servicio web de terceros.Instalar certificados en el almacén de certificados de usuario local de Windows en C#

En mi instalador llamo a una pequeña aplicación (C#) que crea un usuario para ejecutar el servicio como.

Funciona bien.

Ahora necesito instalar alrededor de 10 certificados (¡no preguntar!) En el almacén de certificados de los usuarios, pero no puedo encontrar ninguna forma programática sucinta para hacerlo.

¿Alguna pista? O voy a tener que utilizar COM interopera ...

Respuesta

12

Resulta que primero debe suplantar al usuario.

Uso de la biblioteca muy agradable describe en A small C# Class for impersonating a User, puede hacer lo siguiente:

using (new Impersonator("username", "", "password")) 
{ 
    try 
    { 
     X509Store serviceRuntimeUserCertificateStore = new X509Store(StoreName.My); 
     string baseDir = AppDomain.CurrentDomain.BaseDirectory; 
     string certPath = Path.Combine(baseDir, certificateFolder); 

     string certificateFile = "c:\\file.cert"; 
     string certificatePassword = "somePassword"; 
     string certificateLocation = certPath + "\\" + certificateFile; 

     InstallCertificate(certificateLocation, certificatePassword); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex); 
    } 
} 

private static void InstallCertificate(string certificatePath, string certificatePassword) 
{ 
    try 
    { 
     var serviceRuntimeUserCertificateStore = new X509Store(StoreName.My); 
     serviceRuntimeUserCertificateStore.Open(OpenFlags.ReadWrite); 

     X509Certificate2 cert; 

     try 
     { 
      cert = new X509Certificate2(certificatePath, certificatePassword); 
     } 
     catch(Exception ex) 
     { 
      Console.WriteLine("Failed to load certificate " + certificatePath); 
      throw new DataException("Certificate appeared to load successfully but also seems to be null.", ex); 
     } 

     serviceRuntimeUserCertificateStore.Add(cert); 
     serviceRuntimeUserCertificateStore.Close(); 
    } 
    catch(Exception) 
    { 
     Console.WriteLine("Failed to install {0}. Check the certificate index entry and verify the certificate file exists.", certificatePath); 
    } 
} 

Por favor, añada su propio manejo de excepciones. Si está agregando varios certificados, mantenga la X509Store abierta durante todo el proceso para mayor eficiencia.

+0

¿Cree que la razón por la que debe hacerse pasar por el usuario es porque necesita derechos para leer la clave privada? Si es así, probablemente puedas agregar permisos más adelante si es necesario. –

Cuestiones relacionadas