忽略 ASP.NET Core 3.1 中的 WCF 证书错误

Posted

技术标签:

【中文标题】忽略 ASP.NET Core 3.1 中的 WCF 证书错误【英文标题】:Ignore WCF certificate errors in ASP.NET Core 3.1 【发布时间】:2021-06-13 18:04:18 【问题描述】:

我有这样的解决方案:

-MySolution
|--MyWCFWrapper
|--MyaspnetcoreWebApp
|--ConsoleTestApp

MyWCFWrapper 是一个 .NET Standard 库,使用通过 Visual Studio 导入向导添加为 WCF 引用的 WCF 服务。

MyaspnetcoreWebApp 应用程序提供控制器供前端使用。在这个控制器中,我正在实例化并调用 MyWCFWrapper 库。

ConsoleTestApp 是一个控制台应用程序,它还调用 MyWCFWrapper 库进行测试。

我收到一个错误:

System.ServiceModel.Security.SecurityNegotiationException: '无法为具有权限'exampleabc.com' 的 SSL/TLS 安全通道建立信任关系

当我进行 WCF 服务调用时。

出现此错误的原因是我在 exampleablc.com 上的 WCF 服务是一个测试服务器,并且具有自签名证书(与 Web 服务不同的名称)并且也过期

适用于 ConsoleTestApp 的解决方法:

System.Net.ServicePointManager.ServerCertificateValidationCallback +=
    (se, cert, chain, sslerror) =>
    
        return true;
    ;
MyWCFWrapperClass api = new MyWCFWrapperClass(..);
api.SendNewInfo("NewInfo");

这是不推荐,但我现在还可以,因为它是一个测试服务器。

相同的解决方法在 MyaspnetcoreWebApp 控制器中不起作用。我试图让它发挥作用:.

Startup.cs
public void ConfigureServices(IServiceCollection services)

    services.AddHttpClient("SeitaCertificate").ConfigurePrimaryHttpMessageHandler(() =>
    
        return new HttpClientHandler()
        
            ServerCertificateCustomValidationCallback = (request, certificate, certificateChain, policy) =>
            
                return true;
            
        ;
    );
    services.AddControllersWithViews();
    ----

在我的本地 PC 上将证书添加到受信任的根证书颁发机构。这可能是因为证书已过期而失败。

在 WCF 调用库中引发了证书错误,我无法找到忽略证书错误的方法。 我能做的至少是更新证书以使其不会过期。 (我已经开始这个过程,可能需要一些时间)

我想学习一种方法,如何选择性地适当地捕获和忽略这些证书错误,以便在 asp .net core 3.1 Web 应用程序中调用 WCF 库。我该怎么做?

【问题讨论】:

您好,问题解决了吗?如果您认为我的回复对您有帮助,您可以将其标记为答案。 【参考方案1】:

可以参考以下代码绕过证书验证:

            BasicHttpsBinding binding = new BasicHttpsBinding();
            binding.Security.Mode = BasicHttpsSecurityMode.Transport;
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
            ChannelFactory<IService> factory = new ChannelFactory<IService>(binding, new EndpointAddress(uri));

            factory.Credentials.ServiceCertificate.SslCertificateAuthentication = new System.ServiceModel.Security.X509ServiceCertificateAuthentication()
            
                CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.None,
                RevocationMode = System.Security.Cryptography.X509Certificates.X509RevocationMode.NoCheck
            ;

【讨论】:

我使用了 svcutil(VS 添加 WCF 引用)来创建 Reference.cs 类。在这种情况下,只需修改它创建的 Client 的构造函数并使用基类的 ChannelFactory 就更容易了。

以上是关于忽略 ASP.NET Core 3.1 中的 WCF 证书错误的主要内容,如果未能解决你的问题,请参考以下文章

Asp.net core 3.1 中的路由

ASP.NET Core 3.1 中的证书身份验证实现

ASP.Net Core 3.1 - Web API 中的 Post 参数始终为 NULL

ASP.NET Core 3.1 中的 Ocelot API Gateway 自定义聚合器问题

如何从 Asp.NET Core 3.1 启动类访问 launchSettings.json 中的 `applicationUrl` 属性?

带有 MongoDb 的 ASP.NET Core 3.1 中的身份服务器 4