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.
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). –
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. –