.net - gratis - instalar certificado ssl iis
¿Cómo agrego SSL a una aplicación.net que utiliza httplistener?*No*se ejecutará en IIS (6)
Esta es una forma alternativa de enlazar el certificado SSL con la combinación IP / PORT sin usar httpcfg.exe
(XP) o netsh.exe
(Vista +).
http://dotnetcodebox.blogspot.com.au/2012/01/how-to-work-with-ssl-certificate.html
La esencia de esto es que puedes usar una API HttpSetServiceConfiguration C ++ integrada en Windows para hacerlo programáticamente en lugar de hacerlo a través de la línea de comandos, eliminando así la dependencia del sistema operativo y teniendo instalado httpcfg.
Las ediciones más recientes en negrita estoy usando la clase .net HttpListener
, pero no estaré ejecutándome en IIS y no usaré ASP.net. Este sitio web describe qué código usar para implementar SSL con asp.net y este sitio describe cómo configurar los certificados (aunque no estoy seguro si solo funciona para IIS).
La documentación de la clase describe varios tipos de autenticación (básica, resumen, Windows, etc.) --- ninguno de ellos se refiere a SSL. Sí dice que si se usa HTTPS, deberá establecer un certificado de servidor . ¿Va a ser una configuración de propiedad de una línea y HttpListener
cuenta del resto?
En resumen, necesito saber cómo configurar los certificados y cómo modificar el código para implementar SSL.
Aunque no ocurre cuando intento acceder a HTTPS, noté un error en el registro de eventos del sistema: el origen es "Schannel" y el contenido del mensaje es:
Se produjo un error fatal al intentar acceder a la clave privada de credencial del servidor SSL. El código de error devuelto por el módulo criptográfico es 0x80090016.
Editar:
Pasos tomados hasta el momento
- Se creó un HTTPListener en funcionamiento en C # que funciona para las conexiones HTTP (por ejemplo, " http://localhost:8089/foldername/ "
- Creado un certificado usando makecert.exe
- Agregó el certificado para ser confiable usando certmgr.exe
- Utiliza Httpcfg.exe para escuchar conexiones SSL en un puerto de prueba (p. Ej. 8090)
- Se agregó el puerto 8080 al HTTPListener a través de listener.Prefixes.Add ( https://localhost:8090/foldername/ ");
- probado una conexión de cliente HTTP, por ej. ( http://localhost:8089/foldername/ ") en un navegador y recibe el retorno correcto
- probado una conexión de cliente HTTPS, por ejemplo ( http://localhost:8090/foldername/ ") en un navegador y recibir" Data Transfer Interrupted "(en Firefox)
- La depuración en el estudio visual muestra que la devolución de llamada del oyente que recibe las solicitudes nunca se golpea cuando se inicia la conexión HTTPS. No veo ningún lugar donde pueda establecer un punto de interrupción para detectar algo más antes.
- netstat muestra que los puertos de escucha están abiertos tanto para HTTPS como para HTTP. el puerto HTTPS va a TIME_WAIT después de intentar una conexión.
- Fiddler y HTTPAnalyzer no captan nada del tráfico, supongo que no llega lo suficientemente lejos en el proceso para aparecer en esas herramientas de análisis HTTP
Preguntas
- ¿Cuál podría ser el problema?
- ¿Hay una pieza de código .Net que me falta (es decir, tengo que hacer más en C # además de simplemente agregar un prefijo al oyente que apunta a HTTPS, que es lo que he hecho)
- ¿Ha olvidado un paso de configuración en alguna parte?
- ¿Qué más podría hacer para analizar el problema?
- ¿El mensaje de error en el registro del evento del sistema es una señal del problema? Si es así, ¿cómo se solucionaría?
He encontrado el mismo problema que tú. Afortunadamente, después de googlear los pasos difíciles en esta página, el SSL funciona con mi HttpListener.
tiene esta nota:
Si crea un HttpListener usando https, debe seleccionar un Certificado de Servidor para ese oyente. De lo contrario, una consulta HttpWebRequest de este HttpListener fallará con un cierre inesperado de la conexión.
y esto:
Puede configurar los Certificados de Servidor y otras opciones de escucha utilizando HttpCfg.exe. Consulte http://msdn.microsoft.com/library/default.asp?url=/library/en-us/http/http/httpcfg_exe.asp para obtener más detalles. El archivo ejecutable se envía con Windows Server 2003 o puede compilarse a partir del código fuente disponible en Platform SDK.
¿La primera nota es explicada por la segunda? Como se indica en la pregunta, utilicé httpcfg.exe para vincular el certificado a un puerto específico. Si intentan algo más que esto, la nota es ambigua.
Solo tiene que vincular un certificado a un puerto ip: y luego abrir su oyente con un prefijo https: //. 0.0.0.0 se aplica a todas las ip. appid es cualquier GUID aleatorio, y certhash es el hash del certificado (a veces llamado thumprint).
Ejecute lo siguiente con cmd.exe utilizando privilegios de administrador.
netsh http add sslcert ipport=0.0.0.0:1234 certhash=613bb67c4acaab06def391680505bae2ced4053b appid={86476d42-f4f3-48f5-9367-ff60f2ed2cdc}
Si desea crear un certificado autofirmado para probar esto,
- Abra IIS
- Haga clic en el nombre de su computadora
- Haga clic en el icono Certificados del servidor
- Haga clic en generar certificado autofirmado
- Haga doble clic y vaya a detalles
Verá la huella digital allí, solo elimine los espacios.
HttpListener listener = new HttpListener(); listener.Prefixes.Add("https://+:1234/"); listener.Start(); Console.WriteLine("Listening..."); HttpListenerContext context = listener.GetContext(); using (Stream stream = context.Response.OutputStream) using (StreamWriter writer = new StreamWriter(stream)) writer.Write("hello, https world"); Console.ReadLine();
Después de ejecutar este programa, simplemente navegué a https://localhost:1234
para ver el texto impreso. Como el certificado CN no coincide con la url y no está en el almacén de certificados de confianza, recibirá una advertencia de certificado. El texto está encriptado, sin embargo, como puede verificar con una herramienta como Wire Shark.
Si desea más control sobre la creación de un certificado x509 autofirmado, openssl es una gran herramienta y hay un puerto para Windows. He tenido mucho más éxito que la herramienta makecert.
También es muy importante que si se está comunicando con un servicio https del código que tiene una advertencia SSL, debe configurar el validador de certificado en el administrador del punto de servicio para omitirlo con fines de prueba.
ServicePointManager.ServerCertificateValidationCallback += (sender, cert, chain, errors) => true;
Tengo un problema similar y parece que podría haber un problema con el certificado en sí.
Aquí está el camino que funcionó para mí:
makecert.exe -r -a sha1 -n CN=localhost -sky exchange -pe -b 01/01/2000 -e 01/01/2050 -ss my -sr localmachine
luego busque la thumbprint certificado, thumbprint en el portapapeles y elimine espacios. Este será un parámetro después de -h en el siguiente comando:
HttpCfg.exe set ssl -i 0.0.0.0:801 -h 35c65fd4853f49552471d2226e03dd10b7a11755
luego ejecute un host de servicio en https://localhost:801/ y funciona perfectamente.
Lo que no puedo hacer es que https se ejecute en un certificado autogenerado. Aquí está el código que ejecuto para generar uno (manejo de errores para mayor claridad):
LPCTSTR pszX500 = subject;
DWORD cbEncoded = 0;
CertStrToName(X509_ASN_ENCODING, pszX500, CERT_X500_NAME_STR, NULL, pbEncoded, &cbEncoded, NULL);
pbEncoded = (BYTE *)malloc(cbEncoded);
CertStrToName(X509_ASN_ENCODING, pszX500, CERT_X500_NAME_STR, NULL, pbEncoded, &cbEncoded, NULL);
// Prepare certificate Subject for self-signed certificate
CERT_NAME_BLOB SubjectIssuerBlob;
memset(&SubjectIssuerBlob, 0, sizeof(SubjectIssuerBlob));
SubjectIssuerBlob.cbData = cbEncoded;
SubjectIssuerBlob.pbData = pbEncoded;
// Prepare key provider structure for self-signed certificate
CRYPT_KEY_PROV_INFO KeyProvInfo;
memset(&KeyProvInfo, 0, sizeof(KeyProvInfo));
KeyProvInfo.pwszContainerName = _T("my-container");
KeyProvInfo.pwszProvName = NULL;
KeyProvInfo.dwProvType = PROV_RSA_FULL;
KeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET;
KeyProvInfo.cProvParam = 0;
KeyProvInfo.rgProvParam = NULL;
KeyProvInfo.dwKeySpec = AT_SIGNATURE;
// Prepare algorithm structure for self-signed certificate
CRYPT_ALGORITHM_IDENTIFIER SignatureAlgorithm;
memset(&SignatureAlgorithm, 0, sizeof(SignatureAlgorithm));
SignatureAlgorithm.pszObjId = szOID_RSA_SHA1RSA;
// Prepare Expiration date for self-signed certificate
SYSTEMTIME EndTime;
GetSystemTime(&EndTime);
EndTime.wYear += 5;
// Create self-signed certificate
pCertContext = CertCreateSelfSignCertificate(NULL, &SubjectIssuerBlob, 0, &KeyProvInfo, &SignatureAlgorithm, 0, &EndTime, 0);
hStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"MY");
CertAddCertificateContextToStore(hStore, pCertContext, CERT_STORE_ADD_REPLACE_EXISTING, 0);
El certificado se muestra bien y tiene una clave privada que funciona, pero https tendrá un tiempo de espera como si la huella digital nunca se hubiera registrado. Si alguien sabe por qué - por favor comente
EDIT1 : Después de algunos juegos, he encontrado la inicialización para CertCreateSelfSignCertificate que genera el certificado apropiado:
CRYPT_KEY_PROV_INFO KeyProvInfo;
memset(&KeyProvInfo, 0, sizeof(KeyProvInfo));
KeyProvInfo.pwszContainerName = _T("my-container");
KeyProvInfo.pwszProvName = _T("Microsoft RSA SChannel Cryptographic Provider");
KeyProvInfo.dwProvType = PROV_RSA_SCHANNEL;
KeyProvInfo.dwFlags = CRYPT_MACHINE_KEYSET;
KeyProvInfo.cProvParam = 0;
KeyProvInfo.rgProvParam = NULL;
KeyProvInfo.dwKeySpec = AT_KEYEXCHANGE;
Todavía no lo he implementado por completo, pero este sitio web parece dar una buena guía para configurar los certificados y el código.