一般来说,我希望客户端协商支持和启用的最高 TLS 级别。由于仅尝试 TLS 1.0 后连接失败,我怀疑客户端可能不支持和启用 TLS1.1 和 TLS1.2。
使用 .Net 4.7 构建的应用程序将默认为 SecurityProtocolType.SystemDefault,它由操作系统选择,并且可以通过注册表设置进行修改。 SecurityProtocolType 定义为:
... SecurityProtocol 属性的枚举类型。用这个
枚举以确定您的传输安全协议策略
您在 .NET Framework 中使用 HTTP API,例如 WebClient,
HttpWebRequest、HttpClient 和 SmtpClient(使用 TLS/SSL 时)。
无论操作系统默认设置为什么,早期的框架版本都可能默认为特定的协议类型。在大多数情况下,如果启用了其他协议,他们仍应尝试其他协议。
如果您看到的行为不是您想要的,那么首先要确保目标框架版本和操作系统版本都能够支持您想要启用的安全协议类型(例如 TLS 1.2)。操作系统版本支持的协议版本列表为here。
如果 .Net 的目标版本和操作系统版本都支持 TLS1.2,那么您应该能够通过设置 ServicePointManager 安全协议类型来强制连接只接受 TLS1.2。
要将其限制为单一协议(例如 TLS1.2),只需在进行网络调用之前进行设置:
.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
您可以将OR 协议放在一起,这样您就可以启用 TLS 1.1 和 1.2,同时通过执行以下操作保留已启用的协议:
System.Net.ServicePointManager.SecurityProtocol |=
SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
如果您只想关闭像 TLS1.0 这样的旧协议同时允许其他协议(包括未来版本),那么您可以执行以下操作:
System.Net.ServicePointManager.SecurityProtocol &= ~SecurityProtocolType.Tls;
可以即时进行设置,也可以根据需要放入全局配置中,例如 Global.asax Application_Start。
ServicePointManager.SecurityProtocol 的文档是here。
为了完整起见,我注意到如果您必须以 .Net4.0 为目标,您仍然可以使用上述技术来指定 TLS1.2,前提是您只需将 .Net4.5 与目标版本一起安装。如果您更新几个 .dll 文件,甚至可以使用旧版本的框架来执行此操作。说明是here。
值得注意的是,根据证书配置、注册表设置和安装的更新,整个过程可能会以其他方式失败。
我了解您希望远离用户设置,但有些浏览器设置也可能会影响此行为。请参阅 MSDN 博客文章 here,其中涉及 Firefox 和 IE 的设置。
在客户端,您可以在浏览器设置中进行检查。如果你
在上面列出的任何受支持的 Windows 操作系统上使用 IE,然后在
IE,浏览到工具 -> Internet 选项 -> 高级。在下面
安全部分,您将看到受支持的 SSL 协议列表
IE。 IE 仅支持那些安全协议版本,即
由操作系统的底层 SCHANNEL 组件支持。
编辑:
如果以上信息不足以纠正问题,那么是时候启动 WireShark 并直接查看 TLS 协商了。只需将您的捕获过滤器设置为“SSL”,选择您要跟踪的 IP 地址,然后使用下拉菜单或键盘快捷键Ctrl-Alt-Shift-S 跟踪 SSL 流。您可能会发现问题毕竟出在服务器端,或者您可能会在一侧或另一侧看到证书问题。
即使您通常不使用 WireShark,执行此操作也非常快,并且有很多可用的教程。我喜欢 cisco 网站上的一个 here,如果链接消失,我将简要引用它:
跟随 ssl 流会给你一个清晰的整体画面
TLS握手和交换公钥,证书到交换
用于进一步加密的对称密钥。
... 使用 https 连接时总是发生的第一件事是
客户端(您的浏览器)宣布其密码功能,它基本上
告诉服务器您连接到什么安全算法
有能力。这显示在下面的屏幕截图中