2011-09-13 44 views
12

Trong ứng dụng khách C# Windows của tôi, tôi có một POST gửi đến "bà mẹ". Tôi muốn các dữ liệu trong các đệ trình được bảo đảm, tất nhiên, vì vậy tôi trả tiền cho HostGator cấp cho tôi một chứng chỉ SSL.Sử dụng System.Net.WebClient với chứng chỉ HTTPS

tôi lưu ra file .CER, và tôi đang xây dựng theo yêu cầu như vậy:

//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)); 

nó ném một System.Net.WebException:

Kết nối tiềm ẩn đã được đóng cửa: Đã xảy ra lỗi không mong muốn khi gửi.

Các InnerException là một System.IO.IOException:

Các handshake thất bại do một định dạng gói tin bất ngờ.

Bất kỳ thông tin chi tiết nào về những gì tôi đang làm sai?

+0

Bạn có muốn chứng chỉ SSL trên máy khách hoặc máy chủ không? – SLaks

+1

Để làm rõ: bạn có muốn mã hóa thông tin liên lạc (bạn cần chứng chỉ trên máy chủ) không? Hoặc bạn có muốn xác thực máy khách (bạn cần chứng chỉ ứng dụng khách) không? Để cụ thể, bạn sẽ cần một khóa riêng (một tệp .PFX, có lẽ) ở đầu có liên quan. –

+0

Tôi không hoàn toàn thành thạo trong các cách bảo mật. Tôi có thể truy cập trang web lưu trữ trong trình duyệt bằng giao thức HTTPS. Tôi muốn đăng dữ liệu lên cùng một máy chủ/trang web với mã hóa. Vì vậy, @SLaks - Tôi không chắc chắn, về mặt kỹ thuật nói, những gì tôi muốn. Tôi chỉ biết trong giáo dân những gì tôi cần như mô tả ở trên. –

Trả lời

11

Nếu bạn không sử dụng client chứng chỉ và bạn có thể truy cập máy chủ của bạn sử dụng https: // sau đó mã của bạn sẽ giống như thế:

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)); 

Chừng nào làm BASE_URL sử dụng https: // thì tất cả dữ liệu (đến và từ máy chủ) sẽ được mã hóa.

IOW sử dụng SSL/TLS từ máy khách đến máy chủ không yêu cầu khách hàng thực hiện bất kỳ điều gì đặc biệt (với chứng chỉ), ngoài việc sử dụng https: // làm lược đồ, vì hệ điều hành cung cấp mọi thứ (ví dụ: rễ đáng tin cậy), bạn cần phải bảo đảm việc truyền dữ liệu.

+0

Tôi đã làm như bạn đã nói --- mã của tôi giống như mã bạn đã đăng và BASE_URL của tôi là 'https: // www.myserver.com /', nhưng tôi nhận được thông báo lỗi chính xác giống như được mô tả trong bài gốc. _NOW_ tôi đang làm gì sai? –

+1

Tách vấn đề của bạn thành nhiều phần. Trước tiên, bạn có thể sử dụng WebClient để tải xuống trang chính của mình (bằng cách sử dụng https://www.myserver.com/)? Nếu điều đó không hoạt động thì hãy đảm bảo nó hoạt động từ trình duyệt web (và kiểm tra các thuộc tính của trang để đảm bảo nó được mã hóa). Nếu điều đó hoạt động thì hãy thử mã tải lên của bạn mà không cần SSL, tức là trên http://www.myserver.com/ để đảm bảo phần này hoạt động. Có khả năng một phần sẽ không hoạt động và điều đó sẽ cung cấp cho bạn (và chúng tôi) một số gợi ý để giúp bạn. – poupou

+0

bằng cách sử dụng 'client.DownloadData (" https://www.myserver.com/ ")' _works_. sau đó sử dụng 'client.UploadValues ​​(" http://www.myserver.com/ ")' _also works_. Điều đó có nghĩa là gì? –

1

Có vẻ như bạn đang làm ngược lại. Bạn nên cài đặt Chứng chỉ SLL trên máy chủ/máy chủ web. Sau đó, bạn tạo một yêu cầu web cho máy chủ web và yêu cầu giao thức HTTPS.

+0

Tôi không hoàn toàn thành thạo trong các cách bảo mật. Tôi có thể truy cập trang web lưu trữ trong trình duyệt bằng giao thức HTTPS. Tôi muốn đăng dữ liệu lên cùng một máy chủ/trang web với mã hóa. –

4

Khách hàng chứng chỉ sẽ hoạt động chỉ nếu khóa riêng khả dụng. Đây không phải là thường là trường hợp khi sử dụng tệp .cer kể từ chứng chỉ X.509 không không bao gồm khóa cá nhân.

Các chỉ an toàn cách để đảm bảo các khóa bí mật có sẵn là để tải các chứng chỉ từ một PKCS tập tin # 12 nơi cả hai giấy chứng nhận (s) và khóa bí mật có sẵn (tức là cả hai đều xuất khẩu vào . pfx tệp).

Ghi chú:

  • tôi đã nói thường vì Windows/CryptoAPI đôi khi hiện một số diệu (khi được sử dụng với X509Certificate) và tự động kết hợp một chứng chỉ bằng một khóa riêng từ các cửa hàng certificate.key.

  • Tôi đã nói an toàn vì điều đó cũng sẽ hoạt động trên Mono, không chỉ MS .NET.

+0

Đây là cách trên đầu của tôi. Tôi lấy/tạo/tìm tệp PKCS # 12 ở đâu? Và làm thế nào để tôi tải khóa riêng tư từ nó? –

+1

Trước tiên hãy chắc chắn bạn * muốn * chứng chỉ ứng dụng khách :-) Mã nguồn của bạn là (sai) bằng cách sử dụng tính năng này nhưng nó không rõ ràng đó là những gì bạn muốn. Nếu bạn chỉ muốn "https" từ máy chủ thì bạn không cần phải xử lý chứng chỉ từ ứng dụng khách của bạn. – poupou

+0

Tôi muốn bảo mật dữ liệu cuộc gọi WebClient.UploadValues ​​của tôi. Thats tất cả tôi thực sự biết làm thế nào để truyền đạt. Vì vậy, tôi hỏi bạn: tôi có cần giấy chứng nhận _need_client không? –

0

Chỉ cần kết nối với máy chủ của bạn với RDP

Mở IE và đi đến Internet Options

Navigate to nâng cao Tab và Enable cả Use SSL 2.0 và SSL 3.0

Bây giờ yêu cầu máy chủ của bạn sẽ được xác thực

Các vấn đề liên quan