C# EWS api-无法连接prem上的ExchangeServer

C# EWS api-无法连接prem上的ExchangeServer,c#,linux,asp.net-core,centos7,exchangewebservices,C#,Linux,Asp.net Core,Centos7,Exchangewebservices,我正在实现Microsoft EWS api,以便从prem Exchange服务器上获取电子邮件。考虑到微软已经放弃了开发,我使用的是1982年的SherlockFork。我的应用程序是用.net core 2.1编写的,在本地PC(win10)上运行时,一切正常。考虑到它是Linux,不可能自动获取自动发现url,因此我在代码中手动设置它,正如github页面上建议的那样 public async void GetInbox() { string ew

我正在实现Microsoft EWS api,以便从prem Exchange服务器上获取电子邮件。考虑到微软已经放弃了开发,我使用的是1982年的SherlockFork。我的应用程序是用.net core 2.1编写的,在本地PC(win10)上运行时,一切正常。考虑到它是Linux,不可能自动获取自动发现url,因此我在代码中手动设置它,正如github页面上建议的那样

public async void GetInbox()
        {
            string ewsUrl = "https://mail.domain.com/EWS/Exchange.asmx";

            try
            {
                var service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);

                service.UseDefaultCredentials = false;
                // service.Credentials = new NetworkCredential("domainUsername", "password", "domain");
                service.Url = new Uri(ewsUrl);

                Mailbox mb = new Mailbox("emailAddress");

                var cache = new System.Net.CredentialCache();
                cache.Add(service.Url, "NTLM", new 
                System.Net.NetworkCredential("domainUsername", "password", 
                "domain"));
                service.Credentials = cache;

                FolderId fid = new FolderId(WellKnownFolderName.Inbox, mb);

                Folder inbox = await Folder.Bind(service, fid);
                if (inbox != null)
                {
                    _database.LogEvent("LOG", "GetInbox", $"InboxCount: {inbox.TotalCount}");
                }
            }
            catch (Exception e)
            {
                _database.LogEvent("Error", "GetInbox", $"{e.Message}");
            }

        }
部署到运行CentOS7的测试服务器时,我收到以下消息:

请求失败。无法建立SSL连接,请参阅内部异常

   at Microsoft.Exchange.WebServices.Data.EwsHttpWebRequest.GetResponse(CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\EwsHttpWebRequest.cs:line 147
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request, CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\Requests\ServiceRequestBase.cs:line 798
   --- End of inner exception stack trace ---
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request, CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\Requests\ServiceRequestBase.cs:line 808
   at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\Requests\ServiceRequestBase.cs:line 688
   at Microsoft.Exchange.WebServices.Data.SimpleServiceRequestBase.InternalExecuteAsync(CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\Requests\SimpleServiceRequestBase.cs:line 57
   at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.ExecuteAsync(CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\Requests\MultiResponseServiceRequest.cs:line 134
   at Microsoft.Exchange.WebServices.Data.ExchangeService.BindToFolder(FolderId folderId, PropertySet propertySet, CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\ExchangeService.cs:line 325
   at Microsoft.Exchange.WebServices.Data.ExchangeService.BindToFolder[TFolder](FolderId folderId, PropertySet propertySet, CancellationToken token) in D:\dev_in_progress\ews-managed-api-master\Core\ExchangeService.cs:line 345
   at ExchangeFiles.Email.Download_PI_Files_Email() in D:\dev_in_progress\get_emails_v1\ExchangeFiles\Email.cs:line 199 
我已尝试使用忽略证书 服务点管理器 .ServerCertificateValidationCallback+= (发件人、证书、链、sslPolicyErrors)=>真

但是没有运气(我也会犯同样的错误)

更新: 我添加了以下代码

                ServerCertificateCustomValidationCallback = (message, cert, chain, sslPolicyErrors) =>
                {
                    if (cert.GetCertHashString().ToLower() == "someHashCert")
                    {
                       return true;
                    }

                    if (sslPolicyErrors == SslPolicyErrors.None)
                    {
                      
                        return true;   //Is valid
                    }

                    return false;
                }
在创建HttpClientHandler的代码中。它在if“cert.GetCertHashString().ToLower()”中输入,这很好。我已从浏览器复制了someHashCert的值。 我还试着设置

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", false);
但此代码的错误(以及检查证书时出现的错误)是: 请求失败。处理程序不支持使用libcurl(7.29.0)及其SSL后端(“NSS/3.44”)的这种组合对证书进行自定义处理。需要基于“OpenSSL/1.0.2k-fips”的SSL后端。考虑使用St.NET.NET.HTTP.SokStuttPhandLo.

如果我设定

AppContext.SetSwitch("System.Net.Http.UseSocketsHttpHandler", true);
我得到: 请求失败。GSSAPI操作失败,出现错误-请求了不受支持的机制(未知错误)

我还尝试为MS doc的证书设置回调,但随后收到“无法获取本地颁发者证书”消息

不确定这是前进还是后退。。。我有一种感觉,我已经尝试了一切

更新2 ExchangeSever版本为2016,使用NTLM身份验证和TLS1.0/1.1

我试过curl-v-k-I--anyauth-u:mail.server.domain:443,它说

* About to connect() to mail.server.domain: port 443 (#0)
*   Trying xx.xx.xx.xxx...
* Connected to mail.server.domain (xx.xx.xx.xxx) port 443 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: mail.server.domain::443
> Accept: */*

任何想法都欢迎。。。谢谢

在Cent OS上更新您的TLS。 TLSv1.2应在CentOS 7上提供

一些文件

Linux OpenSSL 1.1.1在不同的Linux操作系统中支持TLS v1.3

RHEL 8-Red Hat Enterprise Linux 8是第一个与TLS v1.3协议完全集成到操作系统中的企业Linux发行版

较旧的CentOS和RHEL OS版本默认安装了OpenSSL v1.0.2,因此本机不支持TLS v1.3。 OpenSSL可以更新为OpenSSL v1.1.1以支持TLS v1.3

大宗报价

如何在CentOS RedHat Linux上安装OpenSSL v1.1.1: 使用OpenSSL版本命令验证OpenSSL版本:

openssl版本 安装wget(如果未安装):

yum安装wget 使用wget下载最新版本:

wget 解压缩文件:

tar xvf openssl-1.1.1.tar.gz 需要进一步配置,请在进行任何更改之前咨询您的系统管理员

默认情况下在系统范围内禁用。如果在系统上启用TLS v1.3进行测试,则

TLS应该得到OS和.net framework的支持。 检查操作系统,如果不支持TLS 1.2,则升级操作系统 然后使用支持TLS1.2/1.3的.net框架 在Cent OS上也安装自签名证书

TLS 1.3是否在.NET上受支持

对于.NET,此时的官方指导(通过上面的最佳实践页面)是依靠底层操作系统提供TLS版本(它将自动默认为TLS协议的最强可用版本),并避免在应用程序代码中硬编码/指定显式TLS版本

从.NET Framework 4.7开始,默认配置是使用OS TLS版本


其他可能有用的链接:和

不幸的是,这里没有任何建议有效

我在github上发现了一些关于类似问题的评论,以及如何将项目更新为.NETCore3.1修复了错误,所以我决定尝试一下


这不是一项小工作,我在解决方案中有几个项目,但我可以确认,在从.NET core 2.1更新到.NET core 3.1后,一切都正常工作。

针对哪个版本的Exchange?2019和Office365要求您使用TLS 1.2hello@GlenScales,如代码中所述,其ExchangeVersion.Exchange2013_SP1。但是在从CentOS机器调用“openssl s_client-connect mail.domain.local:443”之后,它确实告诉我协议是TLSv1.2。不知道下一步该做什么。。。ThanksOkay所以听起来你的问题恰恰相反,因为服务器不支持TLS1.2。因此,您可以在服务器上启用该选项(这将是更好的选择),也可以使用System.Net.ServicePointManager.SecurityProtocol降级您的客户端(这不是一个好主意)(尽管您需要验证该端口是否使用httpclient或httpwebrequest,因为我相信这只会在以后的版本中起作用)抱歉,有一个问题,我对协议/证书不太了解,但为什么您认为exchange server不支持TLS 1.2,而在协议TLSv1.2下呢。我从openssl命令中获得了一些更有趣的日志,如:verify error:num=20:无法获取本地颁发者证书验证返回代码:21(无法验证第一个证书)*NSS error-8179(secu error\u UNKNOWN\u issor)*对等方的证书颁发者未被识别。默认情况下,Exchange 2013上未启用TLS 1.2(由于其使用年限)因此,如果您运行的旧版本忽略了启用TLS1.2之类的功能,那么这可能是一个很好的机会。它是否也使用自签名证书?考虑到这个错误,我会尝试手动导入证书编译OpenSSL,这是一个不好的建议,因为它通常不会得到任何维护(例如,未来安全缺陷的安全修复),因为