Permiso para IUSR para CertOpenSystemStore()

Permiso para IUSR para CertOpenSystemStore()

Mi aplicación CGI intenta utilizar SSPI Schannel para crear una conexión TLS con otro servidor. http://www.coastrd.com/c-schannel-smtp

El proceso de protocolo de enlace comienza verificando si hay un certificado en el almacén de certificados "MI". http://msdn.microsoft.com/en-us/library/aa376560(VS.85).aspx

¿Esta función devuelve cero y GetLastError también devuelve cero? Supongo que se trata de un problema de permisos. ¿Cómo hago para que esto funcione sin elevar IUSR a administrador, por ejemplo?

AGREGADO

Para acceder a los certificados de usuario es necesario ejecutarlo como el usuario específico y para acceder a la clave privada del usuario es necesario que el usuario haya iniciado sesión localmente con la contraseña o que el servidor esté habilitado para la delegación.

Todos pueden leer los certificados de máquina, pero acceder a la clave privada requiere derechos de administrador (o usuario local) a menos que ajuste la ACL.

AGREGADO

En esta situación, no hay restricciones para los certificados, pero "MI" almacén de certificados está vacío y no quiero comprar un certificado solo para esto.

Actualmente estoy usando WS2003. El servidor al que me estoy conectando es gmail.com para enviar correos electrónicos mediante TLS. Mi código puede buscar un certificado, pero no tengo uno. En la lectura que he hecho, parece un gran dolor de cabeza obtener un certificado, con registro, compra e instalación; de lo contrario, solo obtienes una solución temporal que no sirve de nada. A menos que conozca una manera fácil de obtener un certificado, esto es mucho más problemático de lo que quisiera simplemente para enviar correo electrónico desde una aplicación CGI. ¿Hay alguna otra manera?

Aprecio MUCHO tu ayuda Joe, pero $30/año x nServers simplemente no es una opción. Me pregunto si hay alguna manera de transferir la tarea a otro proceso que SE esté ejecutando con privilegios de administrador, como quizás un servicio. Incluso podría crear una aplicación programada para leer desde una carpeta determinada y enviar cualquier correo electrónico que se encuentre allí. Aparte de eso, tendría que intentar elevar la aplicación CGI a Administrador.

AGREGADO

Goyuix, gracias por las sugerencias. El desafío es proporcionar una solución independiente sin recurrir a otras bibliotecas como .NET (60 MB) o ASP con los problemas que conlleva.

Tienes razón, solo necesito autenticación del servidor. No sabía que era posible autenticar solo un lado. su declaración: "No tener un certificado de cliente no debería impedirle establecer un canal seguro para SMTP. Es posible que solo necesite codificar esa parte del protocolo de enlace". resultó ser la solución.

Esto me recuerda el viejo chiste del fontanero. Se llama al fontanero para desbloquear el desagüe. Echa un vistazo, saca un martillo y golpea la tubería una vez. Pide $180 por 5 minutos de trabajo detallados como, $30 de cargo por llamada y $150 para saber dónde golpear la tubería.

Gracias a los dos. Este ha sido un LARGO camino cuesta arriba.

Respuesta1

La única razón por la que el código schannel intenta abrir la tienda "MI" es buscar un certificado potencial que pueda usarse para la autenticación del cliente como parte del protocolo de enlace inicial. En su ejemplo, me imagino que realmente solo le importa la autenticación del servidor (por ejemplo, asegúrese de que su cliente esté hablando con el servidor que cree que es). No tener un certificado de cliente no debería impedirle establecer un canal seguro para SMTP. Es posible que solo necesites codificar esa parte del apretón de manos.

Si también necesita autenticación de cliente, probablemente tendrá que hacer lo siguiente:

  • Eleve la cuenta IUSR e instale un certificado en el almacén de la máquina.
  • cambiar el grupo de aplicaciones para que se ejecute como un usuario diferente y luchar contra eso

En cuanto a arreglar el código vinculado... bueno, sugeriría probar el código SmtpClient que viene con .NET framework si esa es una opción. Admite comunicaciones cifradas y, en teoría, debería "simplemente funcionar". ¿El C++ administrado es siquiera una opción? O mejor aún, ¿simplemente escribir un controlador ASP.NET para esto?

http://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient_members.aspx

También puedes intentar hacer algunas preguntas sobre códigos relacionados enStackOverflow.com, la gente de allí también podría ayudar.

Respuesta2

La mejor opciónIver es utilizar un certificado de máquina y otorgar permiso a la cuenta IUSR para leer la clave privada del certificado. Este es un paso manual, pero muy sencillo que sólo debe realizarse una vez.

¿Existen otros requisitos en su situación que impedirían cambiar los permisos del certificado?


Instrucciones para empezar

Primero, necesitas un certificado. Puedes generar el tuyo propio, pero dependiendo de cómo quieras usarlo y del otro extremo que lo validará, es posible que tengas que comprar uno. No cubriré cómo generar un certificado. Si nunca antes ha trabajado con certificados y autoridades certificadoras, le recomiendo que primero aprenda sobre ellos.

Asumiré que estás en Windows Server 2003 a menos que comentes lo contrario.

1) Instale el certificado en el almacén de la máquina. Ir a Inicio | Ejecute e ingrese MMC para obtener una consola MMC en blanco. Ir a Archivo | Agregar o quitar complemento. Haga clic en el botón Agregar para seleccionar el complemento. Elija Certificados de la lista y haga clic en Agregar. Elija la opción Cuenta de computadora, luego Siguiente, Finalizar, Cerrar y finalmente Aceptar.

2) Importar el certificado a Machine Store. Expanda el árbol y elija la carpeta Personal. Haga clic derecho en Personal y elija Todas las tareas, Importar. Siga el asistente para completar el proceso. El certificado ahora debería estar en el almacén de la máquina.

3) Ajustar los permisos de la clave privada. En Windows 2008, esto se agrega a la GUI del Administrador de certificados. En Windows 2003, deberá descargar elHerramientas del kit de recursos de Windows Server 2003. Utilice el formato del siguiente comando para establecer permisos:

C:\Program Files\Windows Resource Kits\Tools\winhttpcertcfg.exe -g -c LOCAL_MACHINE\My -s "mycert" -a "USER_ACCOUNT" 

Donde 'LOCAL_MACHINE\My' es el almacén de certificados personales en la máquina local, 'mycert' es el nombre de su certificado y USER_ACCOUNT es la cuenta a la que se le otorgarán permisos de lectura para la clave privada. Puede probar la cuenta IUSR, pero es posible que necesite utilizar el 'SERVICIO DE RED' dependiendo del contexto exacto en el que se ejecuta su aplicación CGI. Deberá reiniciar IIS para que los cambios surtan efecto. Eldocumentación para WinHttpCertCfgcubre lo que está haciendo.

Ahora debería tener permisos para acceder a la clave privada. Seguirá utilizando CertOpenSystemStore con el indicador MY.

Espero que ayude.


Edición 2:

Un lugar sencillo para obtener un certificado de una autoridad reconocida es GoDaddy. Puede obtener un certificado SSL válido por 1 año por $30. Hay otros lugares que podrían ser más baratos si buscas un poco. No es demasiado difícil de hacer. La mayoría de los sitios son muy fáciles de usar y facilitan la compra de un certificado.

Dado que está realizando una autenticación mutua, necesitará un certificado con una autoridad válida, y no solo uno autofirmado que pueda crear usted mismo porque el servidor de Gmail no tendría forma de verificarlo.

información relacionada