下面是我編寫的代碼片段,用於向我們擁有的內部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
我做了一些測試,看來你是對的。當我從文件創建證書時,它似乎沒有私鑰。我現在從本地機器商店獲得它,現在它肯定有私鑰,但是我仍然在「底層連接已關閉:接收時發生意外錯誤」。我採取了網絡跟蹤,最後一次重置是從我的機器到服務器,所以我現在想知道是否我的機器拒絕服務器的證書。我認爲這條線會抓住它? [System.Net.ServicePointManager] :: ServerCertificateValidationCallback = {$ true} – user1636358
由於您似乎正在使用默認的可信證書存儲,所以如果IE對該服務器證書沒有問題,那麼您的腳本也應該如此。通常避免使用'ServerCertificateValidationCallback = {$ true}',因爲它會禁用信任驗證。正如我所說,如果有MITM代理(提琴手或其他),這些都不會起作用。也許值得用Wireshark來看看:如果你超越了握手(加密的應用程序數據包),那麼服務器證書不應該成爲問題。 – Bruno
對我的測試來說,我沒有提琴手在跑。我做了一個網絡跟蹤,它看起來像最後一次重置來自我的機器到服務器,這就是爲什麼我想知道它是否是證書回來。感謝您的幫助。對話非常有幫助。 – user1636358