在 C# 中验证连接安全协议
Verify Connection Security Protocol in C#
我的应用程序连接到外部服务以接收数据。外部服务正在更新其安全协议以排除 TLS 1.0 及以下版本。我已经将以下内容添加到 Global.asax:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 |
SecurityProtocolType.Tls11 |
SecurityProtocolType.Tls;
但是,我想确认我是通过 Tls 1.1 或更高版本连接到外部服务。
是否可以查看连接中使用的安全协议?我怀疑它存储在 request/response 对象的某个属性中的某处。
var request = (HttpWebRequest) WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "application/json";
request.Headers["Device-Token"] = deviceId;
var response = request.GetResponse().GetResponseStream();
有谁知道我在哪里可以找到这些信息?或者是否有更好的方法来验证正在使用的安全协议?
编辑
为了坚持更好的做法(根据 Jf Beaulac 的评论),设置连接协议的代码更改为:
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 |
SecurityProtocolType.Tls11;
如果您只想检查连接实际使用的级别,只需在设置 SecurityManager.SecurityProtocol
的值时删除不需要的协议。如果连接使用您排除的协议,将发生异常。
请注意,应避免按照 Global.asax 中的方式指定 SecurityProtocol,这是一种不好的做法。看MSDN上的备注:
我发现 PayPal 也在更改其安全设置。
PayPal 提供了一个 API 端点 (https://tlstest.paypal.com/) 用于测试应用程序的安全协议以确保它支持 TLS 1.2 和 HTTP/1.1.
我是这样测试的:
MVC 应用程序
./Global.asax.cs
...
protected void Application_Start()
{
...
// Add Tls 1.1 and 1.2 to security protocol list (without removing defaults)
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls1.2 | SecurityProtocolType.Tls1.1
}
...
./Controllers/TestConnection.cs
using System;
using System.IO;
using System.Net;
using System.Web.Http;
namespace MyMVCApplication.Controllers
{
public class TestConnectionController : ApiController
{
public string Get()
{
var url = new Uri("https://tlstest.paypal.com/");
var request = (HttpWebRequest) WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "application/json";
var response = request.GetResponse().GetResponseStream();
if (response != null)
{
string output;
using (var reader = new StreamReader(response))
{
output = reader.ReadToEnd();
}
return output;
}
return null;
}
}
}
在 运行 应用程序之后,您可以在本地连接到它(我是使用 PowerShell 完成的)并接收来自 PayPal 端点的响应。
PowerShell
$url = "http://localhost:60023/api/TestConnection"
Invoke-WebRequest -Uri $url -Headers @{Authorization = "Basic $credentials"} | ConvertFrom-Json
如果您在Global.asax.cs中将ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12
添加到Application_Start(),您将收到确认信息PalPal_Connection_OK
如果您的连接不支持 TLS 1.2 或 HTTP/1.1,您将收到 400 错误。
更多信息,请访问https://www.paypal-notice.com/en/TLS-1.2-and-HTTP1.1-Upgrade/
我的应用程序连接到外部服务以接收数据。外部服务正在更新其安全协议以排除 TLS 1.0 及以下版本。我已经将以下内容添加到 Global.asax:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 |
SecurityProtocolType.Tls11 |
SecurityProtocolType.Tls;
但是,我想确认我是通过 Tls 1.1 或更高版本连接到外部服务。
是否可以查看连接中使用的安全协议?我怀疑它存储在 request/response 对象的某个属性中的某处。
var request = (HttpWebRequest) WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "application/json";
request.Headers["Device-Token"] = deviceId;
var response = request.GetResponse().GetResponseStream();
有谁知道我在哪里可以找到这些信息?或者是否有更好的方法来验证正在使用的安全协议?
编辑
为了坚持更好的做法(根据 Jf Beaulac 的评论),设置连接协议的代码更改为:
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12 |
SecurityProtocolType.Tls11;
如果您只想检查连接实际使用的级别,只需在设置 SecurityManager.SecurityProtocol
的值时删除不需要的协议。如果连接使用您排除的协议,将发生异常。
请注意,应避免按照 Global.asax 中的方式指定 SecurityProtocol,这是一种不好的做法。看MSDN上的备注:
我发现 PayPal 也在更改其安全设置。
PayPal 提供了一个 API 端点 (https://tlstest.paypal.com/) 用于测试应用程序的安全协议以确保它支持 TLS 1.2 和 HTTP/1.1.
我是这样测试的:
MVC 应用程序
./Global.asax.cs
...
protected void Application_Start()
{
...
// Add Tls 1.1 and 1.2 to security protocol list (without removing defaults)
ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls1.2 | SecurityProtocolType.Tls1.1
}
...
./Controllers/TestConnection.cs
using System;
using System.IO;
using System.Net;
using System.Web.Http;
namespace MyMVCApplication.Controllers
{
public class TestConnectionController : ApiController
{
public string Get()
{
var url = new Uri("https://tlstest.paypal.com/");
var request = (HttpWebRequest) WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "application/json";
var response = request.GetResponse().GetResponseStream();
if (response != null)
{
string output;
using (var reader = new StreamReader(response))
{
output = reader.ReadToEnd();
}
return output;
}
return null;
}
}
}
在 运行 应用程序之后,您可以在本地连接到它(我是使用 PowerShell 完成的)并接收来自 PayPal 端点的响应。
PowerShell
$url = "http://localhost:60023/api/TestConnection"
Invoke-WebRequest -Uri $url -Headers @{Authorization = "Basic $credentials"} | ConvertFrom-Json
如果您在Global.asax.cs中将ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12
添加到Application_Start(),您将收到确认信息PalPal_Connection_OK
如果您的连接不支持 TLS 1.2 或 HTTP/1.1,您将收到 400 错误。
更多信息,请访问https://www.paypal-notice.com/en/TLS-1.2-and-HTTP1.1-Upgrade/