.NET下寄宿於控制檯的HTTPS監聽

附上原文連接:https://blogs.msdn.microsoft.com/jpsanders/2009/09/29/how-to-walkthrough-using-httplistener-or-http-server-unmanaged-code-c-as-an-ssl-simple-server/windows

寫這邊徹底是怕原連接掛了,時間長了命令難以記住。服務器

 

服務器監聽代碼

服務器代碼只需將監聽地址前綴改成https,其餘都同樣。app

HttpListener  httpListen = new HttpListener();
httpListen .Prefixes.Add("https://192.168.3.22:10022/xxx/");
httpListen .Start();

 

服務器生成自簽名證書

這是MakeCert.exe的文檔:http//msdn.microsoft.com/en-us/library/bfsktky3.aspx可使用此程序爲應用程序生成自簽名服務器證書。工具

使用Visual Studio 2008-2010,您只需使用程序菜單中的Visual Studio 2008或2010命令提示符便可訪問MakeCert.exe。  (注意:對於Vista及更高版本,請確保您做爲管理命令提示符運行,以便您具備適當的權限)ui

//MakeCert命令:
makecert.exe -sr LocalMachine -ss MY -a sha1 -n「CN = jsan17708317」-sky exchange -pe -eku 1.3.6.1.5.5.7.3.1

該命令應該返回'Succeeded'。spa

如今,您須要確保Root Authority是可信的。要從上面使用的相同命令提示符執行此操做,請鍵入MMC。而後選擇「文件」,「添加/刪除管理單元...」.net

圖片

而後點擊「添加」按鈕,選擇「證書」。點擊「添加」按鈕......命令行

圖片

選擇「計算機賬戶」,而後單擊「下一步>」,「完成」,「關閉」和「肯定」。線程

圖片

您應該可以擴展左側的樹以顯示我的證書並找到您剛添加的那個(個人惟一一個顯示)...3d

圖片

雙擊您的證書,您將看到相似於此的內容:

圖片

您須要解決Red X問題(沒法驗證證書到受信任的根目錄)。

單擊此對話框中的「證書路徑」選項卡,而後單擊「查看證書」上的問題證書(根代理)。

圖片

您將看到問題是此證書不在「受信任的根」存儲中。 

  圖片

要進入商店,請單擊「詳細信息」選項卡,而後單擊「複製到文件...」按鈕

圖片

點擊「下一步>」兩次,而後點擊「瀏覽」按鈕,將文件保存到本地文檔目錄(將其命名爲「RootCert」),而後完成嚮導,直到您成功導出證書。如今咱們將證書導入受信任的根存儲區。

展開「受信任的根證書頒發機構」樹,而後右鍵單擊「證書」

圖片 

從上下文菜單中選擇「全部任務...」,而後選擇「導入...」並導航到保存「RootCert」的位置,並經過完成嚮導導入證書。

如今,您應該能夠返回到我的存儲中的服務器證書,並查看證書沒有問題(將此對話框保留爲下一步):

圖片

這裏的最後一步是獲取指紋哈希以供下一節使用。

單擊「詳細信息」選項卡,而後向下滾動到對話框中的「指紋」字段,而後單擊它。而後用鼠標掃除下面的數字(不要錯過任何)並使用Ctrl + C組合鍵複製這些數字。

圖片

打開記事本並將這些數字粘貼到其中,以便在下一步中使用。

 

配置機器以使用證書

最後,您須要配置計算機以將剛剛建立的證書與HttpListener正在偵聽https請求的端口和IP地址相關聯。

更新:對於Vista及更高版本,您將使用此處列出的netsh http命令而不是httpcfg.exe:http//msdn.microsoft.com/en-us/library/cc307236( VS.85).aspx

您須要從命令行運行httpcfg並提供您在上一節中得到的哈希,但您須要刪除這些數字之間的空格。在個人例子中,我刪除了空格,哈希是:f4bb35424190e006e5476e97430c5b8136ee5da5

這是我運行的httpcfg命令,用於關聯與個人機器和端口8081(/ i 0.0.0.0:8081)關聯的全部IP地址的證書:

//httpcfg命令:
httpcfg set ssl / i 0.0.0.0:8081/h f4bb35424190e006e5476e97430c5b8136ee5da5

對於Vista及更高版本,您須要先生成一個guid。從上面用過的VS提示符生成能夠輸入的證書:guidgen.exe。而後點擊複製按鈕複製新建立的GUID。將其與您的哈希一塊兒粘貼到記事本中。您將須要文本的第一部分(例如:{FCB0C645-E745-490F-9E7D-2171E03DC9B0})進行下一步。

//netsh命令
netsh http add sslcert ipport = 0.0.0.0:8081 certhash = f4bb35424190e006e5476e97430c5b8136ee5da5 appid = {FCB0C645-E745-490F-9E7D-2171E03DC9B0}

運行時,您將看到結果:HttpSetServiceConfiguration以0結束。

如今仔細檢查此計算機的SSL綁定:

C:\ Program Files \支持工具> httpcfg查詢ssl 
    IP:
    0.0.0.0:8081哈希:f4bb35424190e0 6e5476e9743 c5b8136ee5da5指導
    :{00000000-0000-0000-0000-000000000000} 
    CertStoreName:(null)
    CertCheckMode:0 
    RevocationFreshnessTime:0 
    UrlRetrievalTimeout: 0 
    SslCtlIdentifier:(null)
    SslCtlStoreName:(null)
    標誌:0 
------------------------------------ ------------------------------------------

對於Vista及以上命令是:netsh http show sslcert

故障排除

若是應用程序不起做用,首先驗證您是否正確執行了上述每一步(沒有遺漏某些內容或某些步驟)。

驗證您的證書是否顯示IP和Hash字段與您正在偵聽的內容相對應,而且Hash是您先前爲證書獲取的哈希。

檢查httpcfg查詢ssl並查看是否有其餘偵聽器可能與同一端口衝突。使用命令http delete ssl / i xxxx:8081刪除衝突(將xxxx替換爲您在同一端口上偵聽的任何IP地址)。

對於Vista及更高版本,請確保您使用管理權限運行HttpListener代碼,不然您將沒法註冊您的計算機名稱(您將得到訪問被拒絕或來自非託管代碼的錯誤代碼5)。

補充信息

這是一個簡單的例子。您可能不但願在處理一個請求後中止偵聽。您須要提供一種方法來優雅地關閉偵聽器並處理工做線程上的請求。

您能夠在HttpCfg中指定特定的IP範圍(在MSDN中搜索HttpCfg語法)。在個人示例中,您可使用此綁定到IP地址10.10.3.4:httpcfg 
set ssl / i 10.10.3.4:8081 / h f4bb35424190e006e5476e97430c5b8136ee5da5

您沒法在同一端口上偵聽http和https流量。

 

客戶端代碼

    public bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
    {
      return true;
    }

  if (serverUrl.StartsWith("https", StringComparison.OrdinalIgnoreCase))
  {
    ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
  }

  X509Certificate2 cert = new X509Certificate2(@"C:\Users\Administrator\Documents\RootCert.cer");
  objRequest.ClientCertificates.Add(cert);
相關文章
相關標籤/搜索