6

我在 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 框架中使用这个确切的代码时,它完美地传输了证书。

有谁知道这在 Compact Framework 中是否可行?如果我无法提供 X509Certificate 进行客户端身份验证,我应该采取哪些其他方式来确保身份验证正确(我应该有权访问 CAPI 或其他 Microsoft 加密模块)

谢谢。

4

2 回答 2

1

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

例如,我有一些托管域上的网站,它们的成本很低或根本没有。我一直使用这些网站来测试代码。

但是,要获得 SSL 功能,我必须每月支付 50 美元。所以,我无法在我的网站上测试这些。

测试:如果 Apache 服务器支持 SSL,您应该能够将 URL 替换为 SSL 等效项:http: //www.stackoverflow.comhttps://www.stackoverflow.com

于 2012-12-12T15:23:15.513 回答
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 安全通道的问题。

于 2013-06-10T17:47:04.603 回答