验证 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 服务器获取连接点和用户以及域设置。 有关详细信息,请参阅以下文章: