最近开发SOA服务调用,写程序的时候服务端采用WCF的TransportWithMessageCredential安全模式,证书为自创建。通关soapUI正常调用,可是通过VS程序在
客户端调用提示:"基础连接已经关闭: 未能为SSL/TLS 安全通道建立信任关系"。 开始以为是服务器端配置问题,后来发现是客户端调用时,发现是在获得请求的时候出错了,由于客户端不信任证书关闭联系所致。
在调用https service时往往要进行安全连接验证,用正常的方式调用会抛出错误信息 “The remote certificate is invalid according to the validation procedure”
此时需要进行强制验证通过
在网上一顿搜索,发现了一个决绝办法甚是好用,而且很简单,在请求之前添加一行代码。- ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();
其中AcceptAllCertificatePolicy需要自己定义:
- internal class AcceptAllCertificatePolicy : ICertificatePolicy
- {
- public AcceptAllCertificatePolicy()
- {
- }
- public bool CheckValidationResult(ServicePoint sPoint,
- X509Certificate cert, WebRequest wRequest, int certProb)
- {
- // Always accept
- return true;
- }
- }
以上方法虽然解决了遇到的问题,可是在VS中会提示ServicePointManager.CertificatePolicy已经被否决。由于我是一个喜欢完美的人,于是按照提示使用新的方法来处理。
改造后的代码更加简洁和明了
调用service的代码里加上,然后申明要赋值给委托的方法
- ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;
- private bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
- {
- return true;
- }
就这样了,一个委托搞定!

浙公网安备 33010602011771号