繁体   English   中英

在.Net Compact Framework中使用X509证书进行客户端身份验证HTTPRequest

[英]Using a X509 Certificate in .Net Compact Framework for Client Authentication HTTPRequest

我正在使用Windows Mobile 6,并且想与Apache Web服务器通信时进行客户端身份验证。 我在本地证书存储区中有一个证书,应该很简单:

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 Framework中使用此确切代码时,它可以完美地传输证书。

有谁知道在Compact Framework中是否可行? 如果我不能出示用于客户端身份验证的X509证书,则应采取什么其他方式来确保身份验证正确(我应该可以访问CAPI或其他Microsoft加密模块)

谢谢。

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

例如,我在托管域名上有一些网站,价格不高或根本没有。 我一直在使用这些网站来测试代码。

但是,要获得SSL功能,我必须支付每月50美元的费用。 因此,我无法在自己的网站上对其进行测试。

测试:如果Apache服务器支持SSL,则您应该能够使用等效的SSL替换URL:用https://www.stackoverflow.com替换http://www.stackoverflow.com

好消息:我解决了。 事实证明,这与.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安全通道的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM