使用X509证书在.NET Framework精简版的客户端身份验证的HTTPRequest(Usi

2019-08-03 22:04发布

我在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加密模块)

谢谢。

Answer 1:

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

举例来说,我已经有了,成本很少或几乎没有托管域的几个网站。 我用这些网站上所有的时间测试代码。

但是,要获得SSL能力,我得掏出像$ 50 /月。 所以,我不能测试那些在我的网站。

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



Answer 2:

好消息:我解决它。 原来,不与.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