Scenario: 服务器的 SOAP 使用了 GeoTrust 签名的 EV 证书,WinCE调用时出现“未能与远程服务器建立信任关系”的错误。原因是该 WinCE 设备信任的证书包括 GlobalSign, Thawte 等,但是不包括 GeoTrust.

Cause: 当 WinCE 中没有信任的根证书时,自签名证书,或者即使是经过第三方 CA 签名的证书,均无法通过认证。

Solution: 最好的方法是导入信任的根证书。若无法做到,则需要在程序里令 WinCE 绕过验证机制。

Key tool: 实现证书验证策略的系统静态类 System.Net.ServicePointManager.CertificatePolicy

1. 定义证书策略类,实现证书策略接口

        public class TrustCertificatePolicy : ICertificatePolicy
{
public bool CheckValidationResult(ServicePoint sp, X509Certificate cert, WebRequest req, int problem)
{
if (/* 此处加入语句,判断 cert 证书是否可以信任*/)
return true;
else
return false;
}
}

2. 主程序或主窗口加载时,向 System.Net.ServicePointManager.CertificatePolicy(静态类) 注册该策略,例如:

        private void frmMain_Load(object sender, EventArgs e)
{
System.Net.ServicePointManager.CertificatePolicy = new TrustCertificatePolicy();
}

3. 问题解决。但是最好的解决方案是导入信任的根证书。

05-11 22:27