2012-12-11 64 views
6

Tôi đang làm việc trong Windows Mobile 6 và muốn có xác thực ứng dụng khách khi nói chuyện với máy chủ web Apache. Tôi có một chứng chỉ trong kho chứng chỉ nội của tôi và nó nên được khá đơn giản:Sử dụng Chứng chỉ X509 trong .Net Compact Framework cho Xác thực Máy khách HTTPRequest

X509Store myStore = new X509Store("MY", StoreLocation.CurrentUser); 
myStore.Open(OpenFlags.ReadOnly); 
X509Certificate2Collection certificates = myStore.Certificates; 
X509Certificate2 clientcertificate; 
foreach (X509Certificate 2certificate in certificates) { 
    clientcertificate = certificate; //omitted code to validate certificate 
} 
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(webPage); 
req.AllowWriteStreamBuffering = true; 
req.AllowAutoRedirect = false; 
req.Method = "POST"; 
req.ContentType = "text/xml"; 
req.Accept = "text/xml"; 
req.ClientCertificates.Add(clientcertificate); 
Stream stream = req.GetRequestStream(); 
stream.Write(buffer, 0, buffer.Length); 
stream.Close(); 

Mã này phân khúc làm việc miễn là tôi loại bỏ các "req.ClientCertificates.Add (clientcertificate)" dòng.

Khi được chèn, tôi nhận được thông báo "Không thể thiết lập kênh bảo mật cho SSL/TLS". Maddeningly đủ, khi tôi sử dụng mã này chính xác trong thường xuyên. Net Framework nó truyền giấy chứng nhận hoàn hảo.

Có ai biết nếu điều này có thể thực hiện trong Compact Framework không? Nếu tôi không thể trình bày X509Certificate để Xác thực Khách hàng, tôi nên theo đuổi những cách nào khác để đảm bảo xác thực là đúng (tôi nên có quyền truy cập vào CAPI hoặc các mô-đun mã hóa Microsoft khác)

Cảm ơn.

+0

Hãy xem tài sản [ServicePointManager.CertificatePolicy] (http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.certificatepolicy%28v=vs.90%29.aspx) và giao diện [ICertificatePolicy] (http://msdn.microsoft.com/en-us/library/system.net.icertificatepolicy%28v=vs.90%29.aspx). –

+0

Cảm ơn bạn đã trả lời. Tôi đã cài đặt các chứng chỉ trung gian cũng như thêm mã vào ICertificatePolicy để cho phép tất cả các chứng chỉ, cùng một vấn đề. –

Trả lời

1

Tin tốt: Tôi giải quyết nó. Nó bật ra không phải làm với. Compact Compact Framework. Trong 3.5 CF, HTTPWebRequest.ClientCertificates được hỗ trợ miễn là chứng chỉ X509 có thể được truy cập.

Lý do tại sao Bắt tay SSL không thành công do sự cố tin cậy với chứng chỉ phía máy chủ. Chứng chỉ máy chủ của chúng tôi đã được tự ký và chúng tôi đã sử dụng các chứng chỉ đã được ký cho URL sai, vì vậy ứng dụng sẽ không tin tưởng vào chứng chỉ máy chủ được cung cấp. Đối với mục đích thử nghiệm, chúng tôi áp dụng chính sách Tất cả chứng chỉ tin cậy, sẽ bị xóa để sản xuất.

sealed class AcceptAllCertificatePolicy : ICertificatePolicy 
{ 
    private const uint CERT_E_UNTRUSTEDROOT = 0x800B0109; 

    public bool CheckValidationResult(ServicePoint srvPoint, X509Certificate 
    certificate, WebRequest request, int certificateProblem) 
    { 
     // Just accept. 
     return true; 
    } 
    /*public bool CheckValidationResult(ServicePoint sp, 
    X509Certificate cert, WebRequest req, int problem) 
    { 
     return true; 
    }*/ 
} 

Được tham chiếu ngay trước khi HttpWebRequest

System.Net.ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy(); 

Và điều này giải quyết vấn đề của chúng tôi với SSL/TLS kênh an toàn.

+0

Lưu ý: một điều khác cần được thực hiện: cài đặt chứng chỉ gốc. Tôi đã gặp lỗi tương tự, nhưng điều đó đã được giải quyết khi tôi cài đặt chứng chỉ gốc và trung gian. –

1

Có thể máy chủ Apache của bạn không hỗ trợ kết nối an toàn.

Ví dụ: tôi có một vài trang web trên các tên miền được lưu trữ với chi phí ít hoặc không có gì. Tôi sử dụng các trang web này để kiểm tra mã trên tất cả các thời gian.

Tuy nhiên, để có được các khả năng SSL, tôi phải bỏ ra $ 50/tháng. Vì vậy, tôi không thể kiểm tra những người trên trang web của tôi.

Để kiểm tra: Nếu Apache Server hỗ trợ SSL, bạn sẽ có thể thay thế các URL với SSL tương đương: http://www.stackoverflow.com với https://www.stackoverflow.com

+0

Thật không may, chúng tôi biết Máy chủ Apache hỗ trợ các kết nối an toàn. Nó hoạt động tốt với HTTPS: // không có chứng chỉ ứng dụng khách và cũng với các trình duyệt. Chỉ khi tôi thêm chứng chỉ ứng dụng khách vào yêu cầu web trong Compact Framework, nó ngừng hoạt động. –

+0

Hey, tình cờ, một người khác đã đăng mã X509 của anh hôm nay ở đây: [13858609] (http://stackoverflow.com/q/13858609/153923) Có thể là thứ mà hai bạn có thể cộng tác. Chỉ là một ý nghĩ. – jp2code

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