2012-12-11 2 views
6

Windows Mobile 6에서 작업 중이며 Apache 웹 서버와 통신 할 때 클라이언트 인증을 받고 싶습니다. 나는 내 로컬 인증서 저장소에 인증서를 가지고 오히려 간단합니다 :.Net Compact Framework에서 클라이언트 인증을 위해 X509 인증서 사용 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(); 

이 코드 세그먼트는 한 나는 "req.ClientCertificates.Add (clientcertificate)"라인을 분리 할 때 작동합니다.

삽입되면 SSL/TLS 보안 채널을 설정할 수 없습니다. Maddeningly 정도로, 내가 정규 코드에서이 정확한 코드를 사용할 때 .Net Framework는 인증서를 완벽하게 전송합니다.

Compact Framework에서 가능한지 알고 계십니까? 클라이언트 인증을위한 X509Certificate을 제시 할 수없는 경우 인증이 적절한 지 확인하기 위해 다른 방법을 사용해야합니다 (CAPI 또는 다른 Microsoft 암호화 모듈에 액세스해야 함)

감사합니다.

+0

[ServicePointManager.CertificatePolicy] (http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.certificatepolicy%28v=90.aspx) 속성을 살펴보고 [ICertificatePolicy] (http://msdn.microsoft.com/en-us/library/system.net.icertificatepolicy%28v=90.asp) 인터페이스. –

+0

답장을 보내 주셔서 감사합니다. 중간 인증서를 설치하고 ICertificatePolicy에 코드를 추가하여 모든 인증서, 동일한 문제를 허용했습니다. –

답변

1

좋은 소식 https://www.stackoverflow.com로. .NET Compact Framework와 관련이없는 것으로 나타났습니다. 3.5 CF에서는 X509 인증서에 액세스 할 수있는 한 HTTPWebRequest.ClientCertificates가 지원됩니다.

SSL 핸드 셰이크가 실패한 이유는 서버 측 인증서의 신뢰 문제 때문이었습니다. 당사의 서버 인증서는 자체 서명되었으며 잘못된 URL에 서명 된 인증서를 사용하여 응용 프로그램이 제공된 서버 인증서를 올바르게 신뢰하지 못했습니다. 테스트 목적으로 제작시 제거 될 모든 인증서 신뢰 정책을 적용합니다. 바로 HttpWebRequest를

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

그리고 이것은 SSL/TLS 보안 채널과 우리의 문제를 해결하기 전에 참조 된

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

.

+0

참고 : 수행해야 할 다른 작업은 루트 인증서를 설치하는 것입니다. 동일한 오류가 발생했지만 루트 인증서와 중간 인증서를 설치하면 해결됩니다. –

1

Apache 서버가 보안 연결을 지원하지 않을 수 있습니다.

예를 들어, 거의 또는 전혀 비용이 들지 않는 호스팅 도메인에 몇 가지 웹 사이트가 있습니다. 나는이 웹 사이트를 사용하여 항상 코드를 테스트합니다.

그러나 SSL 기능을 사용하려면 한 달에 50 달러를 버려야합니다. 그래서, 나는 내 사이트에서 그것들을 테스트 할 수 없다. 테스트하려면

: 아파치 서버가 SSL을 지원하는 경우, 당신은 SSL 동등한와 함께 URL을 교체 할 수 있어야한다 : 나는 그것을 해결 : http://www.stackoverflow.com

+0

아쉽게도 Apache 서버는 보안 연결을 지원합니다. HTTPS : //에서는 클라이언트 인증서가 없으며 브라우저에서도 제대로 작동합니다. Compact Framework에서 웹 요청에 클라이언트 인증서를 추가 할 때만 작동이 중지됩니다. –

+0

어쩌면 우연히 다른 사람이 그의 X509 코드를 오늘 여기 게시했습니다. [13858609] (http://stackoverflow.com/q/13858609/153923) 두 사람이 협력 할 수도 있습니다. 그냥 생각. – jp2code

관련 문제