我正在尝试将现有的WCF客户端应用程序移植到Mono下的Linux上运行。现在我正在测试所有内容,弄清楚Mono上有什么作用,什么没有。
客户端通过basicHttpBinding进行超级简单的调用。它工作得很好,直到我启用SSL(即在绑定中指定BasicHttpSecurityMode.Transport)。
异步操作中的异常:System.Net.WebException:获取响应流时出错(写入:身份验证或解密失败。):SendFailure ---> System.IO.IOException:身份验证或解密失败。 ---> Mono.Security.Protocol.Tls.TlsException:从服务器收到的证书无效。错误代码:0xffffffff800b010a
我读过Mono security FAQ;但是,服务器上的SSL证书来自根CA(购买的证书) - 由Equifax安全证书颁发机构颁发。我在针对.svc URL的Ubuntu安装上运行了TlsTest工具,没有任何问题/错误。我也可以在Firefox中使用该服务(没有安全警告)。
我错过了什么?
答案 0 :(得分:2)
Mono的TlsTest文件非常擅长检查这个,所以看起来似乎有点傻 - 但是:你能使用WebClient向.svc文件发出请求并得到回复吗?如果没有,由于某种原因,证书可能仍然存在问题。
我也猜测你使用了mozroots或certmgr工具来验证根CA是否存在?如何通过certmgr将您网站上的证书明确添加到商店?
还有一个提醒:certmgr工具通常用于当前用户的证书副本,您需要指定--machine
arg,以便所有用户都获得证书。
答案 1 :(得分:0)
我发现了一些消除错误的技巧:
using System.Security.Cryptography.X509Certificates;
public class HttpWebRequestClientCertificateTest : ICertificatePolicy {
public bool CheckValidationResult (ServicePoint sp, X509Certificate certificate,
WebRequest request, int error)
{
return true;
}
}
.....
ServicePointManager.CertificatePolicy = new HttpWebRequestClientCertificateTest ();
HttpWebRequest request = ...
也许它适用于在Mono 2.6中存在该错误的其他人。