2012-08-30 43 views
2

下面是我編寫的代碼片段,用於向我們擁有的內部Web服務發出SOAP請求。如果我使用Fiddler運行Fiddler來提醒該網站正在申請證書。如果我向Fiddler提供這個證書,它可以很好地運行。如果我關閉Fidler,則會出現連接已關閉的錯誤。因爲我正在將證書添加到ClientCertificates集合中,所以我正在毆打我的頭,而當我調試它時,我可以看到它具有它。任何想法爲什麼它不會在運行時顯示它? (你會看到我已經從本地計算機存儲抓住它並從文件創建它測試,兩個選項都沒有工作)System.Net.WebRequest不顯示我的證書

  $cert = [System.Security.Cryptography.X509Certificates.X509Certificate2]::CreateFromCertFile($certPath) 
      #$cert = get-item cert:\LocalMachine\* | get-ChildItem | Where-Object -FilterScript {($_.FriendlyName -eq "HRSYS")} 
      $soapWebRequest = [System.Net.WebRequest]::Create($url) 
      $soapWebRequest.ClientCertificates.Add($cert) 
      $soapWebRequest.Headers.Add("SOAPAction", "http://service.wellsfargo.com/provider/hr/entity/teamMemberData/getTeamMemberProfileById/2010/12/") 
      $soapWebRequest.ContentType = "text/xml;charset=`"utf-8`"" 
      $soapWebRequest.Accept = "text/xml" 
      $soapWebRequest.Method = "POST" 
      $soapWebRequest.Timeout = 60000 
      $soapWebRequest.UseDefaultCredentials = $true 

回答

1

看起來X509Certificate2.CreateFromCertFile被設計成只加載一個證書,不是私鑰的證書,這是您需要使用客戶端證書的證書。

X509Certificate2是模擬X.509證書的類,但也有能力將私鑰與其相關聯(私鑰不是證書的一部分,但需要使用證書進行身份驗證)。

使用X509Certificate2(String, SecureString)構造函數可以更好地從PKCS#12文件及其密碼加載證書。

請注意,即使您的客戶端成功發送客戶端證書,使用Fiddler作爲MITM SSL/TLS代理也會使客戶端證書身份驗證失敗。這是因爲Fiddler會提供不是服務器發送的真正證書的服務器證書,從而產生不同的握手。由於客戶端證書認證依賴於客戶端簽署整個握手的摘要,以便服務器可以將其與自己的握手帳戶進行比較,並且由於客戶端和服務器所看到的握手會在MITM代理服務器使用,客戶端證書認證將失敗。

+0

我做了一些測試,看來你是對的。當我從文件創建證書時,它似乎沒有私鑰。我現在從本地機器商店獲得它,現在它肯定有私鑰,但是我仍然在「底層連接已關閉:接收時發生意外錯誤」。我採取了網絡跟蹤,最後一次重置是從我的機器到服務器,所以我現在想知道是否我的機器拒絕服務器的證書。我認爲這條線會抓住它? [System.Net.ServicePointManager] :: ServerCertificateValidationCallback = {$ true} – user1636358

+0

由於您似乎正在使用默認的可信證書存儲,所以如果IE對該服務器證書沒有問題,那麼您的腳本也應該如此。通常避免使用'ServerCertificateValidationCallback = {$ true}',因爲它會禁用信任驗證。正如我所說,如果有MITM代理(提琴手或其他),這些都不會起作用。也許值得用Wireshark來看看:如果你超越了握手(加密的應用程序數據包),那麼服務器證書不應該成爲問題。 – Bruno

+0

對我的測試來說,我沒有提琴手在跑。我做了一個網絡跟蹤,它看起來像最後一次重置來自我的機器到服務器,這就是爲什麼我想知道它是否是證書回來。感謝您的幫助。對話非常有幫助。 – user1636358

2

我找到了我的答案。我必須授予私鑰的權限。爲了測試我的欺騙行爲,並將其添加給所有人。

C:\ Program Files文件(x86)的\ Windows資源工具包\工具> winhttpcertcfg.exe -g -c 「LOCAL_MACHINE \我的」 -s HRSYS -a大家

相關問題