2011-12-22 76 views
1

在我的公司環境中,有一個透明代理需要憑證才能訪問互聯網(每四小時)。在我的應用程序成功通過的憑據是這樣的:透明代理在通過https訪問時出現SSL錯誤

var client = new WebClient(); 
client.Credientals = new NetworkCredential("username", "password"); 
string result = client.DownloadString("http://..."); 
// this works! 

然而,當我INTIAL請求是一個「https://開頭的」 URL,有一個異常拋出:「基礎連接已關閉:無法建立信任關係爲SSL/TLS安全通道。「

現在我目前的解決辦法是:

  • 漁獲引發WebException拋出訪問時「https://開頭的」 URL
  • 添加我的憑據到一個新的請求到任意的「http:// 「網站
    • (這應該‘開放’互聯網四小時的窗口)
  • 回去再試試‘https://開頭’請求

我想知道是否有更好/更清潔的方法來做到這一點?

+0

這似乎是一個壞主意。你真的想在清晰的情況下公開潛在的敏感數據嗎? – 2011-12-22 19:31:43

+0

沒有敏感數據通過明文發送(據我所知)。我添加到通用「http」請求的憑證被透明代理攔截。然後我重試了原始的「https」請求(自透明代理認證了我之後,它現在起作用) – Brandon 2011-12-22 19:36:08

+0

聽起來你正在構建更多的中間人或傳遞服務器而不是真正的代理服務器(類似但是不同)。無論哪種方式,如果您允許代理的用戶允許任何網站通過它,您可能會暴露敏感數據。 – 2011-12-22 19:40:48

回答

6

你現在使用的是一個帶有認證的HTTP代理。到現在爲止還挺好。但它不適用於HTTPS請求,原因如下:

SSL/TLS是端點安全性。這意味着必須通過單個加密通道在客戶端和服務器之間發送數據。

當您連接到HTTP代理時,您告訴它「獲取遠程資源並將其發送給我」,這與端點安全性相矛盾。在這裏,您沒有直接連接到遠程服務器,並且無法驗證其憑證。代理也可以窺視你的數據。

通常,可以使用HTTPS連接到常規HTTP代理或者可以要求HTTP代理訪問HTTPS資源,但是這會破壞安全原因,在這兩種情況下,客戶端無法驗證服務器的憑據和HTTP代理可以記錄或更改正在傳輸的數據。

HTTPS代理以不同的方式工作。在這裏,您可以告訴HTTPS代理服務器「連接到遠程地址,然後只重發任何傳遞的內容」。這樣,代理就會在客戶端和服務器之間創建一個不透明的安全通道,從而保護端點安全。實際上,HTTPS代理可用於隧道傳輸任何流量,而不一定是SSL。因此,您需要通過發送CONNECT請求(包括您的身份驗證)來建立隧道,然後通過同一通道發送常規HTTP GET(URL中沒有主機/地址) - 此請求將轉到目標服務器,而不是代理。

我很懷疑您的WebClient可以在發送請求之前建立隧道。作爲一種選擇,您可以使用我們的SecureBlackbox產品的HTTPBlackbox包,它允許您訪問HTTP和HTTPS資源,並且支持HTTPS代理(在SecureBlackbox中稱爲WebTunneling)和身份驗證。

+0

+1有關詳細說明。我很好奇,是否仍有可能使用HTTP代理通過C#訪問HTTP站點?假設我不介意安全性? – Gabrielius 2015-11-13 09:40:24

+0

@Gabrielius是的,從協議的角度來看,它只是一個「https:// address/path」資源的請求。實際上,對於HTTP代理來說,從哪裏獲取文件並不重要(因爲代理支持所請求的協議,現在該集合通常僅限於HTTP和HTTPS,有時也僅限於FTP)。 – 2015-11-13 20:07:58

+0

您可以告訴我,爲什麼我在通過HTTP WebProxy訪問HTTPs地址時遇到問題(使用'C#')?雖然HTTP網站一切正常。我得到'Timeout'或'Gateway'錯誤。正如我之前提到的,我不介意代理可以看到流量。 – Gabrielius 2015-11-16 11:59:05

相關問題