如何将 System.ServiceModel.ClientBase<TChannel> 设置为忽略 CERT 错误

Posted

技术标签:

【中文标题】如何将 System.ServiceModel.ClientBase<TChannel> 设置为忽略 CERT 错误【英文标题】:How do i Set the System.ServiceModel.ClientBase<TChannel> to Ignore CERT Errors 【发布时间】:2021-11-29 16:58:47 【问题描述】:

我正在将与 WCF 服务通信的应用程序从 .net 4.8 移动到 net5 我运行了实用程序 SvcUtil.exe(导入 WDSL 文件),它生成了 Reference.cs 文件,该文件从 WSDL 文件创建了类和对象.在 net5 中,它现在使用 System.ServiceModel.ClientBase 类与 WCF 服务进行交互,而在 net48 中,它使用的是“System.Web.Services.Protocols.SoapHttpClientProtocol”。代码可以编译,但我现在仍然遇到两个问题,我似乎无法找到使用 SvcUtil.exe 工具生成的新“System.ServiceModel.ClientBase”实现的答案。

    当尝试建立连接时,我总是收到以下异常:

    "无法为 SSL/TLS 安全通道建立信任关系,权限为 'xxx.xxx.xxx.xxx'。" InnerException => "无法建立 SSL 连接,请参见内部异常。" InnerException => "根据验证程序,远程证书无效:RemoteCertificateNameMismatch, RemoteCertificateChainErrors"

    另外,在 net48 版本中,我将 cookie 存储在 cookie 容器中,如下所示:

                 Cookie cookie = new Cookie(cookieParts[0], cookieParts[1], 
                                     serviceUri.LocalPath, serviceUri.Host);
             cookie.Expires = DateTime.Now.AddHours(1);
             _xieServiceRef.CookieContainer = new CookieContainer();
             _xieServiceRef.CookieContainer.Add(serviceUri, cookie);
    

我的问题是 net48 中的一个告诉服务忽略所有证书错误,我们执行以下代码

ServicePointManager.ServerCertificateValidationCallback +=
(sender, cert, chain, sslPolicyErrors) =>  return true; 

从应用程序的任何位置,我们都会绕过这些错误。但是在 net5 中,您必须以不同的方式处理它,唯一的示例是使用 HttpClient 类给出的,并且您使用定义的 HttpClientHandler 回调创建 HttpClient,如下例所示,这将忽略 CERT 错误,就像上面的 net48 代码一样。

var EndPoint = "https://192.168.0.1/api";
var httpClientHandler = new HttpClientHandler();
httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) =>

    return true;
;
httpClient = new HttpClient(httpClientHandler)  BaseAddress = new Uri(EndPoint) ;

在使用 SvcUtil.exe 生成的代码和使用 ClientBase 类作为与 WCF 服务交互的手段时,我找不到类似于上述代码的方法或示例来忽略 CERT 错误。我也找不到 ClientBase 的 Cookie 容器。我是否需要跳过使用 SvcUtil.exe 生成的代码并切换到 HttpClient 而不是 ClientBase。或者是否有类似的方法来存储生成的 cookie 并忽略 CERT 错误。我们无法控制我们正在调用的 API,也没有 REST 版本的 API,也没有即将推出的 API,因此我们只能使用现有的 API。

任何建议将不胜感激,也提前感谢您

更新 所以我做了一些更多的研究和挖掘,我发现使用以下代码:

    //Right Here we are creating the Service Object
    XIEserviceClient _xieServiceRef = null;
    _xieServiceRef = new XIEserviceClient();
    _xieServiceRef.ChannelFactory.Credentials.ServiceCertificate.SslCertificateAuthentication = new X509ServiceCertificateAuthentication()
    
        CertificateValidationMode = X509CertificateValidationMode.None,
        RevocationMode = X509RevocationMode.NoCheck
    ;
    _xieServiceRef.ChannelFactory.Credentials.UserName.UserName = CalderaConfiguration.SelectedOS4000ApiConnection.Username;
    _xieServiceRef.ChannelFactory.Credentials.UserName.UserName = CalderaConfiguration.SelectedOS4000ApiConnection.Password;

我们现在可以绕过证书错误。

现在我只是想弄清楚整个 cookie/身份验证错误,我现在得到以下异常:

"The content type text/html of the response message does not match the content type of the binding (text/xml; charset=utf-8)

我相信,根据 Fiddler 的说法,这似乎是一个身份验证问题,因为似乎从服务返回了一个登录页面我相信这是我仍在调查的 cookie 问题......

【问题讨论】:

【参考方案1】:

有几点需要考虑:

    您有 DNS 和服务器的视线吗? 您使用的证书名称是否正确? 证书还有效吗? 配置不当的负载平衡器是否会搞砸? 新服务器机器的时钟设置是否正确(即,UTC 时间正确[忽略本地时间,这在很大程度上无关紧要]) - 这对 WCF 来说肯定很重要,因此可能会影响常规 SOAP? 是否存在证书信任链问题?如果你从服务器浏览到soap服务,你能得到SSL吗? 与上述相关 - 证书是否已安装到正确的位置? (您可能需要受信任的根证书颁发机构的副本) 服务器的机器级代理设置是否正确? (与用户的代理不同);参见 XP / 2003 的 proxycfg(不确定 Vista 等)

【讨论】:

以上答案: @MPreston - 堆栈溢出does not work like a discussion forum。每个帖子都旨在成为一个问题或一个答案。因此,您应该将该信息添加到您的问题中。

以上是关于如何将 System.ServiceModel.ClientBase<TChannel> 设置为忽略 CERT 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何将Ios文件上传到

Qt如何将文字变成图片?

如何将Bitmap保存为本地图片文件?

在MATLAB中如何将图导出

ASP如何将SQLSERVER数据导出到DBF(VF)

如何将CSV格式转换成JSON格式