2

我試圖建立一個WCF服務使用證書驗證客戶端。我已經閱讀了大量關於如何創建證書的文章,並且我已經能夠這樣做(最終)。WCF,證書認證 - 常見錯誤和混亂的參數

我運行Windows 2008 R2的服務器上安裝的證書機構和證書。當我打開MMC證書管理單元時,我選擇計算機帳戶。它是否正確?我這樣做是因爲我的WCF服務將運行在Windows服務中,並且即使沒有用戶登錄也會運行。但我承認,我不知道三個選項之間有什麼區別:

  1. 我的用戶帳戶
  2. 服務帳戶
  3. 計算機帳戶

一旦管理單元加載,我進口管理局證書到受信任的根證書頒發機構。然後,我將該證書導入受信任的發佈者。這樣做時我不會遇到任何錯誤。當我進行管理證書和該機構簽署的證書導入時,我不會提及任何.pvk文件。我的理解是,私鑰被嵌入到證書或授權證書中。以下是我用來創建每個證書的命令:

MakeCert.exe 
    -n 「CN=InternalCA」 
    -r 
    -sv InternalCA.pvk InternalCA.cer 
    -cy authority 


MakeCert.exe 
    -sk InternalWebService 
    -iv InternalCA.pvk 
    -n 「CN=InternalWebService」 
    -ic InternalCA.cer InternalWebService.cer 
    -sr localmachine 
    -ss root 
    -sky exchange 
    -pe 

注意我使用了-ss root。我看過很多文章使用-ss My。我真的不明白有什麼區別或什麼時候適合使用每個值。

我的WCF服務這臺機器託管服務(Windows服務)內部上運行。當我開始我的窗口服務,它承載WCF服務,它會立即崩潰,並在事件查看器報告一個看似常見的錯誤:

System.ArgumentException:可能 認定證書「CN = TempCertName」可能 沒有私鑰能夠密鑰交換或過程的 可能不 具有訪問權限的私鑰

我發現帖子是說我需要授予運行服務權限的用戶鑰匙。

這一個似乎這裏是一個受歡迎的答案在計算器:Grant access with All Tasks/Manage Private Keys

但我沒有的所有任務選項/管理私鑰

但我不能就如何明確要做到這一點。而且,該服務正在我的域帳戶下運行,該帳戶是管理員,也是安裝該證書的用戶。

請幫助:)

+1

我要看看這有助於。http://stackoverflow.com/questions/893336/wcf-with-nettcpbinding-and-certificate-transport-security/893399#893399 – essedbl 2011-03-15 20:21:35

回答

1

這裏是一個可以幫助你得到你的自我託管SSL WCF服務與自定義的CA /證書最好的工作環節:SSL with Self-hosted WCF Service

從上面的指南得到它後,您可能需要在安裝時設置您的服務programatically to use the right certificate

我發現使用HTTPCfgUI工具驗證我的HTTP.SYS配置比通過命令行httpcfg/netsh命令更容易。

接下來,如果您仍然遇到錯誤,您可以使用WCF Tracing進一步調試。另外,您還應該打開WCF Message Tracing。如果WCF跟蹤未提供足夠的信息,也可以trace the .NET network stack

您可以通過在另一臺計算機上的瀏覽器中打開服務URL來測試服務上的證書/ CA對是否正常工作。它應該首先聲明證書是無效的。然後,將機器上的CA導入受信任的根目錄,然後再次點擊服務URL。這次它應該像往常一樣顯示服務描述頁面,不會有任何警告。

1

我覺得你很親密。下面是一些建議:

  1. 確保你正在連接到您的證書在第二步中的私鑰。您必須在提升的進程中運行命令 - 即使您擁有管理員權限,也必須(例如)右鍵單擊並以「以管理員身份運行」來啓動用於此命令的命令shell。否則,您將無法將私鑰導入localMachine存儲。

  2. 我會使用-ss my並將證書(私鑰)放入個人存儲中。 Here我看到這一點:

    cc.ClientCredentials.ClientCertificate.SetCertificate( StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, 「contoso.com」);

等等,無論您指向您的等價物,請將證書放在那裏。

  1. 您不需要導入CA證書的私鑰(您創建的第一個證書)。這僅僅是爲了與MakeCert簽署更多的證書。您需要在連接的客戶端上使用該CA證書的副本(,而不是私鑰!),否則客戶端將無法驗證InternalWebService證書。

  2. 在服務器計算機上本地不需要CA證書,因爲它只會被客戶端需要。但它並沒有受到傷害,並且如果服務器上的任何內容連接到本地服務,就會需要它。此外,它使InternalWebService證書在MMC管理單元中看起來很好。您可以嘗試在受信任的根存儲中使用CA,也可以不使用CA,您會看到我的意思。但無論如何,我會而不是把CA的私鑰放到本地計算機商店。

  3. 從MMC管理單元檢查InternalWebService的私鑰權限(右鍵單擊證書,然後選擇任務,管理私鑰......)如果您導入的服務運行的服務不同於其他用戶帳戶,那麼肯定它還沒有訪問權限,你必須去訪問它。否則,該服務將獲得證書,但會顯示該證書沒有私鑰。

總結:

具有管理員權限
  • 運行,以確保InternalWebService的私鑰真正把證書存儲區。 (您將在MMC管理單元中的證書上看到一個小鑰匙,並且右鍵單擊該證書將會有一個「Manage Private Keys ...」選項,如果沒有附加私鑰,則該選項不存在。)

  • 將InternalWebService放到Web服務正在查找的地方。我猜想「個人」(a.k.a.「我的」),但你知道你的服務配置在哪裏。無論是當前用戶還是本地機器,請查看您的配置。

  • 授予訪問InternalWebService證書私鑰的權限。

  • 把CA證書 - 沒有其私鑰 - 受信任的根下,你會需要把在客戶端上,以及(或者以其他方式在客戶端在接受「不受信任的證書」,其結束)