验证 EWS 托管 API 的服务器证书

了解如何创建和引用证书验证回调方法,以便可以向 Exchange 服务器提出 EWS 托管 API 请求。

默认情况下,自 Exchange 2007 SP1 起的 Exchange 版本使用自签名 X509 证书对来自 EWS 的调用进行身份验证。 使用 EWS 托管 API 时,需要创建证书验证回调方法;否则,EWS 托管 API 请求将失败。 如果使用自动发现服务,则对 EWS 托管 API 自动发现的方法调用将失败,并出现 AutodiscoverLocalException 错误。 如果使用 Web 生成的 Web 服务代理,可能还必须创建验证回调方法,具体取决于创建代理的方式。

创建验证回调方法的先决条件

若要准备验证服务器证书,请确保符合以下条件:

  • Exchange 服务器正在使用 EWS 的自签名证书。 如果管理员安装了跟踪到根证书的有效证书,则无需创建验证回调方法。

  • 你将创建一个托管应用程序,其中包含对以下必需 .NET Framework 命名空间的引用:

    • System.Net
    • System.Net.Security
    • System.Security.Cryptography.X509Certificates

示例:用于验证 EWS 托管 API 的服务器证书的回调方法

以下代码示例演示如何为 EWS 托管 API 创建 X509 证书验证回调方法。 此方法将验证 X509 证书,并且仅在满足以下任一条件时返回 true:

  • 证书有效,并跟踪到有效的根证书。
  • 证书有效,并由返回它的服务器自签名。

重要

此示例中的证书验证回调方法为开发和测试 EWS 托管 API 应用程序提供了足够的安全性。 但是,它可能无法为已部署的应用程序提供足够的安全性。 你应始终确保使用的证书验证回调方法满足组织的安全要求。

      private static bool CertificateValidationCallBack(
         object sender,
         System.Security.Cryptography.X509Certificates.X509Certificate certificate,
         System.Security.Cryptography.X509Certificates.X509Chain chain,
         System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
      // If the certificate is a valid, signed certificate, return true.
      if (sslPolicyErrors == System.Net.Security.SslPolicyErrors.None)
      {
        return true;
      }
      // If there are errors in the certificate chain, look at each error to determine the cause.
      if ((sslPolicyErrors & System.Net.Security.SslPolicyErrors.RemoteCertificateChainErrors) != 0)
      {
        if (chain != null && chain.ChainStatus != null)
        {
          foreach (System.Security.Cryptography.X509Certificates.X509ChainStatus status in chain.ChainStatus)
          {
            if ((certificate.Subject == certificate.Issuer) &&
               (status.Status == System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.UntrustedRoot))
            {
              // Self-signed certificates with an untrusted root are valid. 
              continue;
            }
            else
            {
              if (status.Status != System.Security.Cryptography.X509Certificates.X509ChainStatusFlags.NoError)
              {
                // If there are any other errors in the certificate chain, the certificate is invalid,
             // so the method returns false.
                return false;
              }
            }
          }
        }
        // When processing reaches this line, the only errors in the certificate chain are 
    // untrusted root errors for self-signed certificates. These certificates are valid
    // for default Exchange server installations, so return true.
        return true;
      }
      else
      {
     // In all other cases, return false.
        return false;
      }
    }

使用 .NET System.Net命名空间中的ServicePointManager类,通过设置 ServerCertificateValidationCallback 属性来连接验证回调方法。 你可以使用类似于以下示例的代码来设置 ServerCertificateValidationCallback 属性。

ServicePointManager.ServerCertificateValidationCallback = CertificateValidationCallBack;

后续步骤

为 EWS 托管 API 创建验证回调方法后,可以使用自动发现服务从 Exchange 服务器获取连接点和用户以及域设置。 有关详细信息,请参阅以下文章:

另请参阅