SignalR具備自簽名SSL和自主機

SignalR具備自簽名SSL和自主機

 

在研究中試過個人運氣,但到目前爲止尚未快樂。javascript

我想將SignalR javascript客戶端鏈接到自簽名的SignalR Windows服務綁定到自簽名SSL證書。java

個人應用程序在http上工做得很好,可是當Owin WebApplication開始使用https時,客戶端會重複斷開鏈接。web

如下是我使用SSL配置SignalR所作的工做。瀏覽器

  1. 使用IIS建立自簽名證書
  2. 將證書導入mmc中的受信任的根證書頒發機構(不肯定是否有幫助)
  3. Ran NETSH命令將SSL綁定到端口8080服務器

    netsh http add sslcert ipport=0.0.0.0:8080 certhash=123456f6790a35f4b017b55d09e28f7ebe001bd appid={12345678-db90-4b66-8b01-88f7af2e36bf}
  4. 在自託管HubConnection實例中添加了代碼以添加這樣的導出SSL(儘管這應該可有可無,由於它是沒法鏈接的客戶端):網絡

    if (File.Exists("MyCert.cer") 
        && Settings.GetSetting(Settings.Setting.SrProtocol).Equals("https", StringComparison.InvariantCultureIgnoreCase))
            connection.AddClientCertificate(X509Certificate.CreateFromCertFile("MyCert.cer"));
  5. 使用https啓動Owin WebApplication(這應該在http.sys中建立綁定)session

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

在SignalR 2.0文檔中,它說:app

要啓動Web服務器,請調用WebApplication.Start(endpoint)。您如今應該能夠在瀏覽器中導航到端點/信號器/集線器。ide

當我瀏覽到URL http://SOME.WHERE.COM:8080/signalr/hubs時,我成功接收到驅動SignalR的javascript。post

當我瀏覽到URL https://SOME.WHERE.COM:8080/signalr/hubs時,我沒有成功,我收到「使用FF重置了與服務器的鏈接」。

我考慮了一些額外的觀點:

  • NETSH SHOW表示網址已註冊

    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表示SSL證書綁定到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

任何幫助是極大的讚揚!

1答案

我相信它如今對我有用。這是我爲了讓事情流動而採起的步驟:

SSL注意事項

SSL和SignalR(Owin WebApplication)要求將證書綁定到端口。

  1. 使用IIS生成自簽名證書,這應該將證書放入CERTMGR中的LOCAL COMPUTER> Personal> Certificates文件夾
  2. 在CERTMGR中移位+拖動證書到LOCAL COMPUTER>受信任的根證書頒發機構>證書文件夾,它應該在那裏複製它
  3. 執行如下命令,將SSL證書綁定到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

    輸出:

    Reserved URL            : https://*:8080/ 
    User: SOMEWHERE\Administrator
    Listen: Yes
    Delegate: No
    SDDL: D:(A;;GX;;;S-1-5-21-138209071-46972887-2260295844-1106)
  4. 運行如下NETSH命令,將端口8080的全部IP地址保留爲「個人服務」應用程序ID和服務賬戶

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

    輸出:

    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. 更新MyServices.exe.config文件以使用https協議(這些是appSetting鍵,用於在My Service啓動時動態設置SignalR的協議和端口)

    <add key="SrProtocol" value="https" />
    <add key="SrPort" value="8080" />
  6. 使用NETSTAT START命令啓動My Service

  7. 運行如下NETSH命令以顯示服務狀態佔用已註冊的URL

    netsh http show servicestate > D:\servicestate.txt

    輸出:

    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/

個人應用程序不依賴於IIS,可是一旦我使用IIS臨時建立綁定到個人SSL證書的端口,個人應用程序就開始工做了,我可以檢查NETSH服務狀態以查看IIS是如何作到的。我已經刪除了IIS綁定並運行了安裝說明,但仍然取得了成功。

個人Owing初創公司看起來像這樣:

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

    }

}

自託管的HubConnetion實例以下所示:

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

這裏有一些代碼比相關的更多,但但願它可能有所幫助!

  •  
    「個人應用程序不依賴於IIS,可是一旦我使用IIS臨時建立綁定到個人SSL證書的端口,個人應用程序就開始工做了,我可以檢查NETSH服務狀態,看看IIS是如何作到的。我從那之後刪除了IIS綁定並運行了安裝說明,但仍然取得了成功。「 因此你說有人須要IIS首先設置ssl證書而後ssl在Owin中使用自託管工做嗎?那將是愚蠢的,由於Owin應該與任何網絡服務器脫鉤......你會在5個月後將你的答案標記爲解決方案,如今有更多的經驗嗎? -  Pascal 2014年 1月26日13:38
  •  
    是的,我不是建議IIS成爲這個過程的一部分,它只是我試圖找到它的底部。此外,我計劃在個人下一個版本中回到SSL,而且很樂意在我審覈時將其標記爲解決方案,請耐心等待;)謝謝! -  ISZ 2014年 2月6日
相關文章
相關標籤/搜索