我在Windows工作Mobile 6和想有客户端身份验证跟一个Apache网络服务器时。 我在我的本地证书存储中的证书,它应该是相当简单:
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建立安全通道”。 令人恼火的是,当我在常规.Net框架使用这个确切的代码它的证书完美传输。
有谁知道这是否可能在精简框架? 如果我不能出示X509证书的客户端身份验证,我应该追求什么其他的方式来确保认证是正确的(我应该有机会获得CAPI或其他Microsoft加密模块)
谢谢。
这可能是因为你的Apache服务器不支持安全连接。
举例来说,我已经有了,成本很少或几乎没有托管域的几个网站。 我用这些网站上所有的时间测试代码。
但是,要获得SSL能力,我得掏出像$ 50 /月。 所以,我不能测试那些在我的网站。
测试:如果Apache服务器支持SSL,你应该能够与SSL相当于更换网址: http://www.stackoverflow.com与https://www.stackoverflow.com
好消息:我解决它。 原来,不与.NET Compact Framework的做。 在3.5 CF,HTTPWebRequest.ClientCertificates是只要X509证书可访问的支持。
为什么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安全通道。
文章来源: Using a X509 Certificate in .Net Compact Framework for Client Authentication HTTPRequest