2012-12-11 101 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

相關問題