2010-12-21 9 views
12

Tengo un certificado .pem para SSL, quiero distribuirlo con mi aplicación web en un MSI (tiene que ejecutarse en las computadoras de los clientes). Entonces necesito importarlo (¿en alguna tienda de credenciales?) Y decirle a mis enlaces de sitios que lo usen. Pero, ¿cómo puedo hacer esto en el código? Descubrí Microsoft.Web.Administration, pero no estoy seguro de dónde ir desde allí ...¿Certificado de importación programáticamente en IIS?

Esto está en IIS7 por cierto.

EDITAR: El objetivo aquí es tener una aplicación web que los clientes puedan ejecutar en sus intranets. Principalmente actúa como una API para una aplicación de iPhone. (Tal vez este no sea el mejor diseño, pero estamos bloqueados ahora.) Entonces el cliente instala el MSI, y listo, tienen un servicio web. Ahora tiene que haber una contraseña de autenticación entre el iPhone y el servicio web; la forma más simple parecía ser hacerlo en https. Así que hice un certificado autofirmado.

Soy consciente de que la redistribución de un único cert es generalmente una mala idea, pero estamos tratando de derrotar a los hackers ocasionales aquí ... esto va a ser intranet solamente y para las empresas solamente, parece poco probable que alguien vaya estar haciendo algo demasiado loco, y el API restringe severamente la cantidad de cosas malas que puedes hacer a la base de datos de todos modos.

Así que ahí vamos, el objetivo es tener autenticación de contraseña en una aplicación web de intranet, con instalación de un clic (ish). :-D

+0

problema interesante, pero lo que realmente quieres ser re-uso de un certificado SSL? Incluso si se trata de un lanzamiento de botón para un gran clúster que sirve su propia aplicación web, es probable que desee ser más cuidadoso con sus certs. – Rup

+0

Tenga en cuenta que man-in-the-middle sigue siendo posible con un certificado autofirmado a menos que todos los teléfonos del cliente tengan este certificado preinstalado en sus almacenes de certificados raíz de confianza antes de ponerse en contacto con la API. – yfeldblum

Respuesta

22

La respuesta, queridos lectores, es la siguiente:

// Assume 'site' is already set to your site via something like 
// Site site = mgr.Sites.Add(siteName, directory, 443); 

X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); 
store.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite); 

// Here, directory is my install dir, and (directory)\bin\certificate.pfx is where the cert file is. 
// 1234 is the password to the certfile (exported from IIS) 
X509Certificate2 certificate = new X509Certificate2(directory + @"\bin\certificate.pfx", "1234"); 

store.Add(certificate); 

var binding = site.Bindings.Add("*:443:", certificate.GetCertHash(), store.Name); 
binding.Protocol = "https"; 
store.Close(); 

Gracias a este tema al azar: http://forums.iis.net/t/1163325.aspx

+4

No olvides llamar a mgr.CommitChanges(). –

2

Debe limitar su pregunta. ¿Para qué se usa el certificado (exactamente)?

Si su certificado se utiliza para la autenticación del lado del cliente (para autenticar al cliente en el servidor), distribuirlo con su aplicación hace que dicha autenticación resulte inútil, ya que estaría revelando la clave secreta.

Si necesita validar el certificado del servidor (y se le ha proporcionado un certificado de servidor o una cadena de certificados en su archivo PEM), podría funcionar, pero ¿por qué debería instalar el certificado en el almacén de certificados?

Debe tener en cuenta que las bibliotecas de Windows o .NET no admiten nativamente el formato PEM, por lo que debe convertirlo a PFX antes de la implementación y luego importar un PFX o simplemente crear una tienda en memoria basada en PFX (lo hará encuentre mucha información buscando PFX o PKCS # 12 en StackOVerflow).

Upd: sería un mejor enfoque para generar el certificado cada vez que instale la aplicación y deje que el usuario tenga su propio certificado (por ejemplo, es posible que ya tengan un certificado válido para su sitio web).

+0

Lo siento, 2am vagueness;) Editado arriba. – Dave

+0

@Dave actualización agregada a mi respuesta también –

+0

Hmm buen punto; aunque supongo que siempre estarás atrapado con ese diálogo de confirmación de certificado autofirmado en el navegador? Estoy decepcionado por ese enfoque ... pero ¿cómo lo hago en el código?(Soy un novato en programación de Windows :-D) EDITAR: La idea aquí es que las personas que instalan este software no conocen las computadoras, por lo tanto, si todo esto estuviera automatizado, sería lo mejor. – Dave

Cuestiones relacionadas