2012-12-11 104 views
6

我正在使用Windows Mobile 6,并希望在与Apache Web服务器交谈时进行客户端身份验证。我有一个证书在我的本地证书存储,它应该是相当简单:只要我删除了“req.ClientCertificates.Add(clientcertificate)”行在.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(); 

此代码段工作。

一旦插入,就会出现“无法为SSL/TLS建立安全通道”。令人毛骨悚然的是,当我在常规的.Net框架中使用这个确切的代码时,它完美地传送证书。

有没有人知道这是否可以在Compact Framework?如果我无法提供用于客户端身份验证的X509证书,还应该采取哪些其他方式来确保身份验证是正确的(我应该可以访问CAPI或其他Microsoft加密模块)

谢谢。

+0

查看[ServicePointManager.CertificatePolicy](http://msdn.microsoft.com/en-us/library/system.net.servicepointmanager.certificatepolicy%28v=vs.90%29.aspx)属性和[ICertificatePolicy](http://msdn.microsoft.com/en-us/library/system.net.icertificatepolicy%28v=vs.90%29.aspx)接口。 –

+0

谢谢你的回复。我已经安装了中间证书以及将代码添加到ICertificatePolicy以允许所有证书,同样的问题。 –

回答

1

好消息:我解决它。事实证明,这与.NET Compact Framework没有关系。在3.5 CF中,只要能够访问X509证书,就支持HTTPWebRequest.ClientCertificates。

SSL握手失败的原因是由于服务器端证书的信任问题。我们的服务器证书是自签名的,我们使用了针对错误URL进行签名的证书,因此应用程序不会信任提供的服务器证书。出于测试目的,我们制定了信任所有证书政策,该政策将被删除以供制作。

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

的HttpWebRequest的

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

这解决了我们的问题与SSL/TLS安全通道前右引用。

+0

注意:还有一件事需要完成:安装根证书。我得到了同样的错误,但是当我安装根证书和中介证书时,这个问题就解决了。 –

1

可能是因为你的Apache服务器不支持安全连接。

例如,我有几个托管域名的网站,几乎没有成本。我一直使用这些网站来测试代码。

但是,为了获得SSL功能,我必须花费50美元/月。所以,我无法在我的网站上测试这些内容。

测试:如果Apache服务器支持SSL,你应该能够与SSL相当于更换网址:http://www.stackoverflow.comhttps://www.stackoverflow.com

+0

不幸的是,我们知道Apache服务器支持安全连接。它可以正常使用HTTPS://没有客户端证书和浏览器。只有当我将客户端证书添加到Compact Framework中的Web请求时,它才会停止工作。 –

+0

嘿,只是偶然,另一个人今天在这里发布了他的X509代码:[13858609](http://stackoverflow.com/q/13858609/153923)可能是你们两个可以合作的东西。只是一个想法。 – jp2code

相关问题