sesion servidor online mvc iniciar generar firma como certificado ssl signalr

servidor - generar request ssl



SignalR con autofirma de SSL y auto-host (1)

Intenté mi suerte en la investigación, pero hasta ahora no hay alegría.

Me gustaría conectar un cliente de SignalR javascript a un servicio de SignalR de Windows autocatenado vinculante a un certificado SSL autofirmado.

Mi aplicación funciona bastante bien con http, pero el cliente se desconecta repetidamente cuando la Aplicación web de Owin comienza a usar https.

Esto es lo que hice para configurar SignalR con SSL.

  1. Creó un certificado autofirmado utilizando IIS
  2. Importó el certificado en las Autoridades de certificación de raíz de confianza en el mmc (no estoy seguro si eso ayudó)
  3. Orden Ran NETSH para vincular SSL al puerto 8080

    netsh http add sslcert ipport=0.0.0.0:8080 certhash=123456f6790a35f4b017b55d09e28f7ebe001bd appid={12345678-db90-4b66-8b01-88f7af2e36bf}

  4. Se agregó código en las instancias de HubConnection alojadas automáticamente para agregar SSL exportado de esta manera (aunque esto no debería importar porque es el cliente el que no se puede conectar):

    if (File.Exists("MyCert.cer") && Settings.GetSetting(Settings.Setting.SrProtocol).Equals("https", StringComparison.InvariantCultureIgnoreCase)) connection.AddClientCertificate(X509Certificate.CreateFromCertFile("MyCert.cer"));

  5. Iniciar la aplicación web Owin utilizando https (esto debería crear el enlace en http.sys)

    string registerUrl = string.Format("{0}://SOME.WHERE.COM:{1}", Service.Server.SrProtocol, Service.Server.SrPort); WebApp.Start<StartUp>(registerUrl);

En la documentación de SignalR 2.0, dice:

Para iniciar el servidor web, llame a WebApplication.Start (endpoint). Ahora debería poder navegar a punto final / signalr / hubs en su navegador.

Cuando navego por la URL http://SOME.WHERE.COM:8080/signalr/hubs recibo con éxito el javascript que maneja SignalR.

Cuando busco la URL https://SOME.WHERE.COM:8080/signalr/hubs, no tengo éxito y recibo "Se restableció la conexión al servidor" mediante FF.

Algunos puntos adicionales que he considerado:

  • NETSH SHOW indica que la URL está registrada

    URL group ID: E300000240000022 State: Active Request queue name: Request queue is unnamed. Properties: Max bandwidth: inherited Max connections: inherited Timeouts: Timeout values inherited Number of registered URLs: 1 Registered URLs: HTTPS://SOME.WHERE.COM:8080/

  • NETSH SHOW indica que el certificado SSL está vinculado a 8080:

    IP:port : 0.0.0.0:8080 Certificate Hash : 123456f6790a35f4b017b55d09e28f7ebe001bd Application ID : {12345678-db90-4b66-8b01-88f7af2e36bf} Certificate Store Name : (null) Verify Client Certificate Revocation : Enabled Verify Revocation Using Cached Client Certificate Only : Disabled Usage Check : Enabled Revocation Freshness Time : 0 URL Retrieval Timeout : 0 Ctl Identifier : (null) Ctl Store Name : (null) DS Mapper Usage : Disabled Negotiate Client Certificate : Disabled

¡Cualquier ayuda es muy apreciada!


Creo que todo está funcionando para mí ahora. Aquí hay un resumen de los pasos que tomé para que las cosas fluyan:

NOTAS DE SSL

SSL & SignalR (aplicación web Owin) requiere vincular un certificado a un puerto.

  1. Use IIS para generar un certificado autofirmado, esto debe colocar el certificado en la carpeta COMPUTADORA LOCAL> Personal> Certificados en CERTMGR
  2. En CERTMGR shift + drag certificate a LOCAL COMPUTER> Trusted Root Certification Authorities> Certificates folder, que debe hacer una copia allí
  3. Ejecute el siguiente comando para vincular el certificado SSL a 0.0.0.0:8080

    netsh http add sslcert ipport=0.0.0.0:8080 certhash=123456f6790a35f4b017b55d09e28f7ebe001bd appid={12345678-db90-4b66-8b01-88f7af2e36bf} netsh http show urlacl > D:/urlacl.txt

    Salida:

    Reserved URL : https://*:8080/ User: SOMEWHERE/Administrator Listen: Yes Delegate: No SDDL: D:(A;;GX;;;S-1-5-21-138209071-46972887-2260295844-1106)

  4. Ejecute el siguiente comando NETSH para reservar todas las direcciones IP para el puerto 8080 a la ID de la aplicación My Service y la cuenta de servicio

    netsh http add urlacl url=https://*:8080/ user=SOMEWHERE/Administrator listen=yes netsh http show sslcert > D:/sslcert.txt

    Salida:

    IP:port : 0.0.0.0:8080 Certificate Hash : 123456f6790a35f4b017b55d09e28f7ebe001bd Application ID : {12345678-db90-4b66-8b01-88f7af2e36bf} Certificate Store Name : (null) Verify Client Certificate Revocation : Enabled Verify Revocation Using Cached Client Certificate Only : Disabled Usage Check : Enabled Revocation Freshness Time : 0 URL Retrieval Timeout : 0 Ctl Identifier : (null) Ctl Store Name : (null) DS Mapper Usage : Disabled Negotiate Client Certificate : Disabled

  5. Actualice el archivo MyServices.exe.config para usar el protocolo https (Estas son las claves appSetting usadas para establecer dinámicamente el protocolo y el puerto de SignalR cuando se inicia My Service)

    <add key="SrProtocol" value="https" /> <add key="SrPort" value="8080" />

  6. Inicie My Service utilizando el comando NETSTAT START

  7. Ejecute el siguiente comando NETSH para mostrar que el estado del servicio está ocupando la URL registrada

    netsh http show servicestate > D:/servicestate.txt

    Salida:

    Server session ID: C300000320000039 Version: 2.0 State: Active Properties: Max bandwidth: 4294967295 Timeouts: Entity body timeout (secs): 120 Drain entity body timeout (secs): 120 Request queue timeout (secs): 120 Idle connection timeout (secs): 120 Header wait timeout (secs): 120 Minimum send rate (bytes/sec): 150 URL groups: URL group ID: C600000340000138 State: Active Request queue name: Request queue is unnamed. Properties: Max bandwidth: inherited Max connections: inherited Timeouts: Timeout values inherited Number of registered URLs: 1 Registered URLs: HTTPS://*:8080/

Mi aplicación NO depende de IIS, pero una vez que utilicé IIS para crear temporalmente un enlace de puerto a mi certificado SSL, mi aplicación comenzó a funcionar, y pude inspeccionar el estado de servicios de NETSH para ver cómo lo hace IIS. Desde entonces, he descartado el enlace de IIS y he revisado las notas de configuración, y todavía tengo éxito.

El inicio de My Owing se ve algo así:

private void configureMessaging() { string registerUrl = string.Format("{0}://*:{1}", Service.Server.SrProtocol, Service.Server.SrPort); try { #if DEBUG //System.Diagnostics.Debugger.Launch(); #endif // Starts an owin web application to host SignalR, using the protocol and port defined. WebApp.Start<StartUp>(registerUrl); } catch (Exception ex) { Logger.Logs.Log(string.Format("Failed to configure messaging. Exception: {0}", ex.RecurseInnerException()), LogType.Error); if (ex is HttpListenerException || ex.InnerException is HttpListenerException) { try { Process p = new Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.FileName = "netsh.exe"; p.StartInfo.Arguments = string.Format("netsh http delete urlacl url={0}" , registerUrl ); p.Start(); p.StandardOutput.ReadToEnd(); p.WaitForExit(); } catch (Exception exP) { Logger.Logs.Log(string.Format("Failed to delete urlacl {0}. Exception: {1}" , registerUrl , exP.RecurseInnerException() ) , LogType.Error ) ; retries = 5; } } if (retries < 5) { retries++; Logger.Logs.Log(string.Format("Attempting to configure messaging again. Attempt No. {0}", retries), LogType.Warn); Thread.Sleep(1000); configureMessaging(); } else Logger.Logs.Log(string.Format("Exceeded total number of retries to configure messaging.", retries), LogType.Error); }

}

Y las instancias de HubConnetion alojadas en el servidor se ven así:

public IHubProxy MyHubProxy { get { if (this._MyHubProxy == null) { var connection = new HubConnection(string.Format("{0}://{1}:{2}/" , Settings.GetSetting(Settings.Setting.SrProtocol) , MyHub.GetLocalhostFqdn(null) , Settings.GetSetting(Settings.Setting.SrPort) ) ) ; this._MyHubProxy = connection.CreateHubProxy("MyHub"); if (File.Exists("My.cer") && Settings.GetSetting(Settings.Setting.SrProtocol).Equals("https", StringComparison.InvariantCultureIgnoreCase)) connection.AddClientCertificate(X509Certificate.CreateFromCertFile("My.cer")); connection.Start().Wait(); } return this._MyHubProxy; } }

Aquí hay un poco más de código que relevante, ¡pero espero que pueda ser de ayuda!