2013-08-09 8 views
17

Próbowałem szczęścia w badaniach, ale do tej pory nie było radości.SignalR z Self-Signed SSL i Self-Host

Chciałbym podłączyć klienta javascript SignalR do samodzielnego hostingu powiązania usługi Windows SignalR z samopodpisanym certyfikatem SSL.

Moja aplikacja działa całkiem dobrze przez http, ale klient wielokrotnie rozłącza się, gdy aplikacja Owin WebApplication zaczyna używać protokołu HTTPS.

Oto, co zrobiłem, aby skonfigurować SignalR z SSL.

  1. utworzono certyfikat z podpisem własnym, używając IIS
  2. Importowany certyfikat do zaufanych głównych urzędów certyfikacji w MMC (nie wiem, czy to pomogło)
  3. Ran polecenia netsh związać SSL na porcie 8080

    netsh http add sslcert ipport=0.0.0.0:8080 certhash=123456f6790a35f4b017b55d09e28f7ebe001bd appid={12345678-db90-4b66-8b01-88f7af2e36bf} 
    
  4. kod Dodane w własny gospodarzem przypadkach HubConnection aby dodać eksportowany SSL tak (chociaż to nie powinno mieć znaczenia, bo to klient, który nie może się połączyć):

    if (File.Exists("MyCert.cer") 
        && Settings.GetSetting(Settings.Setting.SrProtocol).Equals("https", StringComparison.InvariantCultureIgnoreCase)) 
         connection.AddClientCertificate(X509Certificate.CreateFromCertFile("MyCert.cer")); 
    
  5. Zaczynając Owin webapplication użyciu HTTPS (powinno to doprowadzić do utworzenia wiązania w http.sys)

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

W dokumentacji SignalR 2.0, to mówi:

Aby rozpocząć serwer WWW, wywołaj WebApplication.Start (punkt końcowy). Teraz powinieneś być w stanie nawigować do punktu końcowego/sygnalizatora/koncentratorów w przeglądarce.

Po przejściu na URL http://SOME.WHERE.COM:8080/signalr/hubs pomyślnie otrzymuję javascript, który steruje SignalR.

Po przejściu na URL https://SOME.WHERE.COM:8080/signalr/hubs nie udaje mi się i otrzymuję komunikat "Połączenie z serwerem zostało zresetowane" za pomocą FF.

Niektóre dodatkowe punkty Mam uważane:

  • NETSH SHOW wskazuje, że adres URL jest zarejestrowany

    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 wskazuje certyfikat SSL jest zobowiązany do 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 
    

Każda pomoc jest bardzo doceniana!

+1

Oto link do wpisu na blogu z informacjami potrzebnymi do rejestracji i tworzenia certyfikatów SSL oraz konfiguracji SignalR: http://www.west-wind.com/weblog/posts/2013/Sep/23/Hosting- SignalR-under-SSLhttps –

+0

@RickStrahl ten link jest zły ... – Jonesome

+0

Działa dla mnie ... –

Odpowiedz

14

Wierzę, że teraz wszystko działa dla mnie.Oto zaniedbany kroki wziąłem dostać rzeczy płynących:

SSL UWAGI

SSL & SignalR (Owin webapplication) wymaga wiązania certyfikatu do portu.

  1. użycie IIS do generowania samopodpisany cert, to powinien umieścić certyfikat na lokalny komputer> Osobiste> folderu Certyfikaty w CERTMGR
  2. W przesunięcia CERTMGR + certyfikat przeciągania do lokalnego komputera> Zaufane główne urzędy certyfikacji> Folder certyfikaty, które powinny zrobić kopię tam
  3. Uruchom następujące polecenie, aby związać się z certyfikatu SSL do 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 
    

    OUtP UT:

    Reserved URL   : https://*:8080/ 
    User: SOMEWHERE\Administrator 
    Listen: Yes 
    Delegate: No 
    SDDL: D:(A;;GX;;;S-1-5-21-138209071-46972887-2260295844-1106) 
    
  4. Uruchom następujące polecenia netsh zarezerwować wszystkie adresy IP na porcie 8080 do identyfikatora aplikacji i usług uwagę moją usługę

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

    wyjściowa:

    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. Zaktualizuj plik MyServices.exe.config, aby korzystać z protokołu https (są to klucze konfiguracji aplikacji używane do dynamicznie ustawić protokół i port SignalR Podczas uruchamiania Service)

    <add key="SrProtocol" value="https" /> 
    <add key="SrPort" value="8080" /> 
    
  6. Uruchom moją usługę przy użyciu NETSTAT komenda startu

  7. uruchom następujące polecenia netsh, aby pokazać stan serwisowy jest zajmujący zarejestrowanego adresu URL

    netsh http show servicestate > D:\servicestate.txt 
    

    wyjściowa:

    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/ 
    

Moja aplikacja nie zależy od IIS, ale raz użyłem IIS tymczasowo utworzenia portu wiążący do mojego certyfikatu SSL, moja aplikacja zaczęła działać, a ja byłem w stanie sprawdzić NETSH servicestate zobaczyć jak IIS czy to. Od tego czasu opuściłem powiązanie IIS i przejrzałem notatki dotyczące konfiguracji i nadal mam powodzenie.

startowy My Dzięki wygląda somethign tak:

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); 

    } 

}

i self-hosted przypadki HubConnetion wyglądać następująco:

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; 
     } 
    } 

Jest trochę więcej kodu, niż istotne , ale mam nadzieję, że może być pomocna!

+0

"Moja aplikacja NIE zależy od IIS, ale kiedy użyłem usług IIS do tymczasowego utworzenia portu powiązanego z moim certyfikatem SSL, moja aplikacja zacząłem pracować i mogłem sprawdzić servSetate NETSH, aby zobaczyć, jak robi to IIS. Od tego czasu przestałem wiązać IIS i przejrzałem notatki dotyczące konfiguracji, i nadal mam powodzenie. " Więc mówisz, że ktoś potrzebuje usług IIS do skonfigurowania najpierw certyfikatu ssl, a następnie do pracy w ssl z selfhostingiem w Owin? To byłoby głupie, ponieważ Owin powinien zostać odłączony od jakiegokolwiek serwera sieciowego ... Czy oznaczyłbyś swoją odpowiedź jako rozwiązanie 5 miesięcy później, mając teraz więcej doświadczenia? – Pascal

+0

W porządku, nie proponuję IIS być częścią procesu, to tylko coś, co próbowałem dostać się do sedna. Ponadto zamierzam powrócić do SSL w mojej następnej wersji i chętnie oznaczę to jako rozwiązanie, gdy będę je przeglądać, z prośbą o cierpliwość;) Dzięki! – ISZ