[英]Using System.Net.WebClient with HTTPS certificate
在我的C#Windows客戶端中,我有一個POST提交給“母艦”。 當然,我希望提交中的數據是安全的,因此我支付了HostGator向我發放SSL證書的費用。
我保存了.CER文件,我正在構建請求:
//wrapper for WebClient object to use certificate file
class SecureWebClient : WebClient
{
protected override WebRequest GetWebRequest(Uri address)
{
HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);
string certPath = @"e:\mycertificate.cer";
X509Certificate myCert = X509Certificate.CreateFromCertFile(certPath);
request.ClientCertificates.Add(myCert);
return request;
}
}
//request
private static SecureWebClient client = new SecureWebClient();
private static NameValueCollection = new NameValueCollection();
nvc.Add(POST_ACTION, ACTION_CODE_LOGIN);
nvc.Add(POST_EMAIL, email);
nvc.Add(POST_PASSWORD, password);
sResponse = System.Text.Encoding.ASCII.GetString(client.UploadValues(BASE_URL + ACTION_PAGE, nvc));
它拋出一個System.Net.WebException:
底層連接已關閉:發送時發生意外錯誤。
InnerException是一個System.IO.IOException:
由於意外的數據包格式,握手失敗。
對我做錯了什么的見解?
如果您沒有使用客戶端證書,並且可以使用https://訪問您的服務器,那么您的代碼應如下所示:
private static WebClient client = new WebClient();
private static NameValueCollection nvc= new NameValueCollection();
nvc.Add(POST_ACTION, ACTION_CODE_LOGIN);
nvc.Add(POST_EMAIL, email);
nvc.Add(POST_PASSWORD, password);
sResponse = System.Text.Encoding.ASCII.GetString(client.UploadValues(BASE_URL + ACTION_PAGE, nvc));
只要您的BASE_URL使用https://,就會加密所有數據( 進出服務器)。
IOW使用SSL / TLS從客戶端到服務器不要求客戶端做任何特殊的事情(使用證書),除了使用https://作為方案,因為操作系統提供您需要的所有內容(例如,受信任的根)保護數據傳輸。
僅當私鑰可用時, 客戶端證書才有效。 使用.CER文件時,因為X.509證書不包括私鑰這不是通常的情況。
確保私鑰可用的唯一安全方法是從PKCS#12文件加載證書,其中證書和私鑰都可用(即兩者都被導出到.pfx文件中)。
筆記:
我之所以說通常是因為Windows / CryptoAPI有時會產生一些魔力 (當與X509Certificate一起使用時)並自動將證書與來自certificate.key存儲的私鑰相關聯。
我說安全,因為這也適用於Mono,而不僅僅是MS .NET。
聽起來你正在倒退。 您應該在Web主機/服務器上安裝SLL證書。 然后,您創建Web服務器的Web請求,並需要HTTPS協議。
只需使用RDP連接到您的服務器即可
打開IE並轉到Internet選項
導航到“高級”選項卡並啟用“使用SSL 2.0和SSL 3.0”
現在,您的服務器請求將被驗證
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.