我有一个 Web 服务 (asmx) API,它是由我管理的另一位开发人员用 .NET 3.5 编写的。我们最近从 Server 2008R2 迁移到 Server 2012R2,我决定使用 SNI,而不是为每个证书分配一个 IP。
事实证明,我们的一位 API 用户在切换到 SNI 后不再能够连接到我们的 API。我发现他们使用 Server 2003,我认为这是它不再工作的原因。我继续为该站点分配了一个公共(public) IP,这解决了问题。当然,他们将其完全归咎于 .NET 框架。
我有一个测试项目设置,它连接到我们的 API 并运行各种测试,转换后工作正常。
有人能解释一下吗? SoapHttpClientProtocol 是否使用 sslstream?
最佳答案
如果 .NET Framework 依赖于 Schannel,其本身可能无法解决该问题。 Schannel 从 Windows Vista/Windows Server 2008 开始才开始支持 SNI (或来自其他来源 Windows 8/Windows Server 2012 )
嗯,根据第一个链接,SslStream确实依赖于Schannel。我刚刚完成了 Windows 7/.NET 4 和 Windows 8.1/.NET 4.5.1 上的测试用例,我可以看到客户端应用程序利用 SslStream SNI 按预期工作。因此,我认为您粘贴的 Microsoft Connect 链接根本不是有效的。 SNI 在 Windows XP 和 Windows Server 2003 上可能会失败,但应该适用于 Windows Vista 及更高版本。
我没有检查 SoapHttpClientProtocol 的源代码,但我认为 Microsoft 没有使用除 SslStream 或 Schannel 之外的任何东西。
因此,就您的情况而言,我建议您在服务器端回滚所做的更改,并且暂时不要使用 SNI。另一个解决方案是要求所有用户使用 Windows Vista 及更高版本作为操作系统。请注意,Windows XP 已经消亡,Windows Server 2003 也即将消亡(明年就会消亡,所以很快)。
关于.NET SNI 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26171425/