none
[分享]一種變通設置 WinRM 服務 HTTPS 偵聽的方法 RRS feed

  • 常规讨论

  • 先說一下提供這麽一個方法的緣由,我在自己搭建了一個基於 Server Core 的節點 + 多數磁盤的 Failover Cluster 測試環境,用於進行一些測試。
    從測試看搭建的群集,可以满足預期實現。
    但是在對任意一個節點啓用 powershell 帶 HTTPS(SSL) 的 winrm 服務偵聽時遇到問題。
    雖然可以直接使用 Failover Cluster 相關 module 裏的 cmdlet 實現,但是我認爲啓用帶 SSL 的遠程會話是一項正常功能,應該是可以啓用的。
    通過 certreq 向企業 CA 申請證書安裝證書都沒有問題,但是在

    winrm quickconfig -transport:https

    系統提示

    在此计算机上,WinRM 已设置为接收请求。
    WSManFault
        Message
            ProviderFault
                WSManFault
                    Message = 无法创建 HTTPS 上 的 WinRM 侦听程序,因为该计算机不具有适当的证书。若要用于 SSL,证书必须具有与主机名匹配并适合于服务器身份验证且未过期、吊销或自签名的 CN。

    错误编号: -2144108267 0x80338115
    无法创建 HTTPS 上 的 WinRM 侦听程序,因为该计算机不具有适当的证书。若要用于 SSL,证书必须具有与主机名匹配并适合于服务器身份验证且未过期、吊销或自签名的 CN。

    幾番嘗試,都無法成功完成。無論是使用 winrm.vbs, 還是直接用 powershell cmdlet 都無效。
    我懷疑問題與節點存在多個網絡適配器有關,但是通過對 winrm.vbs 跟蹤,雖然找到了關鍵點,爲 WSMAN Session 類的 Invoke 方法

    http://msdn.microsoft.com/en-us/library/aa384458%28v=vs.85%29.aspx

    但是沒有找到指定網絡適配器的設置。

    於是就想到能否通過手動向系統填入必要參數,來繞過命令設置。經過嘗試,發現這個方法是可以的。

    下面説一下,具體的設置方法:

    注: 步驟中提到的設置,均爲我的測試環境機器的相關設置,如果要應用此方法, 請根據時間情況進行修改。

    1. 先找一臺電腦啓用 winrm 服務的 https 偵聽。
       在我的測試環境中,我用的是 Windows 7 客戶端。

    2. 通過
      
       certutil -store my | clip

       將節點 MY 項的具有服務器驗證功能的證書的轉出信息複製到剪貼板中,然後你可以用記事本獲取該内容。

    3. 用 reg 或 regedit 導出如下注冊表項

    HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\WSMAN\Listener\*+HTTPS
    HKLM\SYSTEM\CurrentControlSet\services\HTTP\Parameters\SslBindingInfo\0.0.0.0:5986
    HKLM\SYSTEM\CurrentControlSet\services\HTTP\Parameters\UrlAclInfo

    導出工具用的是 regedit,可以不用敲路徑。

    4. 打開步驟 3 的第一個導出的注冊表項文件,然後進行如下修改

      可以將 *+HTTPS 替換爲指定的 IP, 比如 IP:192.168.2.9+HTTPS
      修改 hostname 中的機器名爲節點的機器名
      修改 certThumbprint 中的證書指紋爲節點的證書指紋,指紋位于步驟 2 中獲取數據中的 "證書哈希(sha1)"。

    5. 對於步驟 3 的第二個導出的注冊表項文件,進行如下修改

       修改 SslCertHash 中的證書哈希爲步驟 2 中獲取數據中的 "證書哈希(sha1)"。

    6. 對於步驟 3 的第三個導出的注冊表項文件,進行如下修改

       刪除除了 https://+:5986/wsman/ 其他設置,并保存。

    7. 確認所有設置修改完成后,將這些文件導入到注冊表。

    8. 通過執行命令重啓 winrm 和 http 服務

       sc stop winrm
       sc stop http
       sc start http
       sc start winrm

    9. 在防火牆上開啓對應端口的入站允許,默認是 5986。如果覺得 netsh 設置入站例外麻煩的話,那之開啓節點遠程防火牆管理,然後在其他電腦上設置。
    10. 現在就可以在遠程客戶端使用 HTTPS 方式連接節點。
    11. 如果遠程機器依然無法連接,那麼可以在遠程機器的 hosts 文件添加節點完全限定名稱的IP映射。


    Folding@Home


    • 已编辑 repl 2014年8月13日 14:47
    2014年8月13日 14:41

全部回复

  • 你好!

    很高兴你的问题能够被解决,并且感谢你的热心分享!



    Steven Lee

    TechNet Community Support

    2014年8月14日 8:35
    版主
  • 目前已初步找到導致 winrm 服務不能建立 HTTPS 偵聽的癥結所在,與供 certreq 申請證書的 inf 配置文件有關。
    我會在測試驗證後,對此帖子進行更新。

    Folding@Home

    2014年8月15日 14:29
  • 經過查找,已經找到原因所在。

    在對原因進行說明之前,先對原有步驟個別地方進行一下補充。

    1. 關於 "修改 hostname 中的機器名爲節點的機器名" 這句中,機器名爲完全限定名,例如: client.domain.com。

    2. 停止 http 服務的步驟

    因爲存在除了 winrm 以外的其他服務依賴與 http 服務,所以直接

    sc stop http

    可能會停止不了, 如果存在依賴關係的服務正在運行的話。

    要停止 http 服務,有兩種方法。

    最簡單的是執行

    net stop http

    它會提示是否一併停止有依賴的服務。

    但這個方法也稍稍有點不足,它是給出的是服務的顯示名,而沒有服務名。這樣在重啓有依賴關係的服務時,會稍微有些不便。

    第二種方法, 分爲兩個步驟, 先通過

    sc enumdepend http 81920 | find /i "service_name"

    枚舉出與 http 有依賴關係的服務。但這個方法也有點問題,它是單純列出服務,但不管那些服務是否在運行。所以你需要要麼手動逐個停止,或者結合 for 命令停止。

    這就是對原來內容的補充說明。

    現在開始說明導致 winrm quickconfig -transport:https 失敗的原因所在。

    正如我自己在第二個回覆中說的那樣,我先修改了基於文本格式的證書請求 inf 文件。

    之所以要修改 inf 文件, 是因爲在 Windows 7 客戶端,在上面用 mmc 做了一次證書申請,然後設置 winrm https 偵聽可以成功完成。

    注:關於該文件格式,請參見我在之前的帖子,所提供的鏈接。

    [分享]關於在 Windows Server 2008 R2 中使用企業級 CA 的一些經驗
    http://social.technet.microsoft.com/Forums/zh-CN/6c649331-3b24-46ad-a9f7-d1c613040c57/-windows-server-2008-r2-ca-?forum=windowsserversystemzhchs

    先通過

    certutil -csplist

    獲取有效的加密提供程序。我把原來的提供程序由 "Microsoft Software Key Storage Provider",替換爲 "Microsoft Enhanced RSA and AES Cryptographic Provider" 後,無論是通過 CLI 方式還是 GUI 方式申請的證書,都可以順利設置 winrm https 偵聽。
    這樣也可以看出問題實際上同機器是否有多個網絡適配器無關,至少在我的測試環境下是這樣的。

    爲何用 "Microsoft Software Key Storage Provider" 就有問題? 明明可以順利申請到證書。

    爲此,我再次在 eventvwr 查詢可能與之相關的日誌。我注意到 CAPI2 是一個與證書相關的日誌類型,但是沒有啓用。於是啓用該日誌,刪除 winrm https 偵聽,以及證書,然後用加密提供程序爲 "Microsoft Software Key Storage Provider" 的證書,再做一遍。

    注: 通過命令方式啓用 CAPI2 日誌的命令,同時使用於完整安裝和 Server Core 安裝的系統。

    1. 先

    wevtutil el | find "CAPI2"

    遍歷並提取出 CAPI2 日誌的完整名稱

    2. 然後

    wevtutil gl "Microsoft-Windows-CAPI2/Operational"

    檢查 enabled 是否爲 true

    3. 如果不是, 則

    wevtutil sl "Microsoft-Windows-CAPI2/Operational" -enabled:true

    重新執行

    winrm quickconfig -transport:https

    後, 在該日誌會看到一個 event id 爲 70 的記錄。

    根據其提示,卻換到詳細信息中,直接查看 XML 內容。可以獲得幾個游泳的數據。

    ProcessID, fileRef, ProcessName, Result

    結合 ProcessID 和 ProcessName 可以獲知,執行命令的程序是一個 svchost 進程,是一個服務。

    將 ProcessID 代入到命令

    tasklist -fi "pid eq ProcessID" -svc

    可以看到若干個服務,其中有兩個值得注意,CryptSvc 和 WinRM。

    先選擇修改 WinRM 的類型修爲 own

    sc config winrm type= own

    own 前面之前的空格是必須的

    sc stop winrm
    sc start winrm

    在重新執行

    winrm quickconfig -transport:https

    並閱讀日誌,這時獲得之前不曾有過的記錄,記錄的內容很詳細,從中可以確認該命令是由 winrm 服務負責處理。

    結合在 Result 獲得的錯誤描述,錯誤代碼。

    經過搜索得到了,下面幾篇文章

    CNG Key Storage Providers
    http://msdn.microsoft.com/en-us/library/windows/desktop/bb931355%28v=vs.85%29.aspx

    "Invalid provider type specified" error when accessing X509Certificate2.PrivateKey on CNG certificates
    http://blogs.msdn.com/b/alejacma/archive/2009/12/22/invalid-provider-type-specified-error-when-accessing-x509certificate2-privatekey.aspx

    SignTool fails with error 0x80092006 on Windows Server 2008
    http://blogs.msdn.com/b/alejacma/archive/2011/03/24/signtool-fails-with-error-0x80092006-on-windows-server-2008.aspx

    Exchange 2013 OWA does not support CNG Key Storage Provider certificate for IIS service
    https://www.sevecek.com/EnglishPages/Lists/Posts/Post.aspx?List=f6e49214-a43d-4fa5-9537-fb46eabe0cb8&ID=40&Web=6dbd0194-ad16-4838-ad08-7f33e3009473

    Unable to access ECP/OWA
    http://social.technet.microsoft.com/Forums/exchange/en-US/a9efd351-032d-47d1-8b68-2ad00f11bcc8/unable-to-access-ecpowa

    因爲自己對文中的 CNG 作用機制還不是理解的很深,所以至於使用何種方法解決該問題,有自己做判斷。


    Folding@Home

    2014年8月17日 15:02
  • 本文也發表在 bbs.winos.cn

    http://bbs.winos.cn/viewthread.php?tid=137710


    Folding@Home

    2014年8月17日 15:09
  • 補充,對 winrm quickconfig -transport:https 再次測試,發現如果同時具有提供程序爲 "Microsoft Strong Cryptographic Provider" 和 "Microsoft Enhanced RSA and AES Cryptographic Provider" 的話, quickconfig 會自動選擇 "Microsoft Enhanced RSA and AES Cryptographic Provider" 的。

    此外再次對 winrm 另一個 create 方法創建 https 偵聽進行測試,選定提供程序爲 "Microsoft Strong Cryptographic Provider" 的證書,沒有發現存在問題。

    查看其 vbs 代碼,沒有發現

    responseStr = sessionObj.Create(resourceLocatorObj, inputStr)

    有特殊之處。


    Folding@Home


    • 已编辑 repl 2014年8月19日 5:45
    2014年8月19日 5:44