2012-12-11 14 views
6

Pracuję w Windows Mobile 6 i chciałbym mieć uwierzytelnienie klienta podczas rozmowy z serwerem Apache. Mam certyfikat w moim lokalnym magazynie certyfikatów i powinien być raczej prosta:Korzystanie z certyfikatu X509 w .Net Compact Framework dla uwierzytelniania klienta 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(); 

Segment ten kod działa tak długo, jak usunąć „req.ClientCertificates.Add (Certyfikat klienta)” linię.

Po wstawieniu otrzymuję komunikat "Nie można ustanowić bezpiecznego kanału dla protokołu SSL/TLS". O dziwo, kiedy używam tego dokładnego kodu w standardowym .Net Framework, transmituje on certyfikat doskonale.

Czy ktoś wie, czy jest to możliwe w Compact Framework? Jeśli nie mogę przedstawić certyfikatu X509 do uwierzytelniania klienta, jakie inne sposoby powinienem zastosować, aby upewnić się, że uwierzytelnienie jest właściwe (powinienem mieć dostęp do CAPI lub innych modułów kryptograficznych Microsoft)

Dzięki.

+0

Spójrz na właściwość [ServicePointManager.CertificatePolicy] (http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.certificatepolicy%28v=vs.90%29.aspx) i interfejs [ICertificatePolicy] (http://msdn.microsoft.com/en-us/library/system.net.icertificatepolicy%28v=vs.90%29.aspx). –

+0

Dziękuję za odpowiedź. Zainstalowałem pośrednie certyfikaty, a także dodałem kod do ICertificatePolicy, aby zezwolić na wszystkie certyfikaty, ten sam problem. –

Odpowiedz

1

Dobra wiadomość: I rozwiązać go. Okazało się, że nie ma to związku z .Net Compact Framework. W wersji 3.5 CF obsługa HTTPWebRequest.ClientCertificates jest obsługiwana, o ile dostęp do certyfikatu X509 jest możliwy.

Przyczyną niepowodzenia uzgadniania SSL był problem zaufania z certyfikatem po stronie serwera. Nasze certyfikaty serwera zostały podpisane automatycznie i wykorzystaliśmy certyfikaty, które zostały podpisane pod kątem nieprawidłowego adresu URL, więc aplikacja słusznie nie ufałaby dostarczonemu certyfikatowi serwera. Do celów testowych wprowadzamy politykę Trust All Certificates, która zostanie usunięta do produkcji.

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; 
    }*/ 
} 

Referenced tuż przed HttpWebRequest

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

I to rozwiązuje nasz problem z SSL/TLS bezpiecznego kanału.

+0

Uwaga: jeszcze jedna rzecz, którą należy zrobić: zainstalować certyfikaty główne. Wystąpił ten sam błąd, ale zostało to rozwiązane, gdy zainstalowałem certyfikat główny i pośredni. –

1

Możliwe, że twój serwer Apache nie obsługuje bezpiecznych połączeń.

Na przykład, mam kilka witryn na hostowanych domenach, które kosztują niewiele lub nic. Korzystam z tych stron internetowych, aby cały czas testować kod.

Ale, aby uzyskać możliwości protokołu SSL, muszę zapłacić jak 50 USD miesięcznie. Nie mogę przetestować tych na moich stronach.

przetestować: Jeśli Apache Server obsługuje protokół SSL, należy być w stanie zastąpić URL z równowartości SSL: http://www.stackoverflow.com z https://www.stackoverflow.com

+0

Niestety, wiemy, że serwer Apache obsługuje bezpieczne połączenia. Działa dobrze z HTTPS: // bez certyfikatów klienta, a także z przeglądarkami. Dopiero po dodaniu certyfikatu klienta do żądania internetowego w Compact Framework przestaje działać. –

+0

Hej, przez przypadek, inny facet opublikował dzisiaj swój kod X509: [13858609] (http://stackoverflow.com/q/13858609/153923) Może to być coś, z czym moglibyście współpracować. Tylko myśl. – jp2code

Powiązane problemy