与支持最多的服务器通信的默认安全协议是什么TLS 1.2?将.NET在默认情况下,选择支持在服务器端安全性最高的协议或做我必须明确地添加此行代码:
System.Net.ServicePointManager.SecurityProtocol =
SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)
除了代码更改之外,有没有办法更改此默认值?
最后,.NET 4.0只支持TLS 1.0吗?即我必须将客户端项目升级到4.5以支持TLS 1.2.
我的动机是删除SSLv3客户端的支持,即使服务器支持它(我已经有一个powershell脚本在机器注册表中禁用它)并支持服务器支持的最高TLS协议.
更新:
查看ServicePointManager该类,.NET 4.0我看到没有枚举值TLS 1.0和1.1.两者都是.NET 4.0/4.5默认值SecurityProtocolType.Tls|SecurityProtocolType.Ssl3.希望SSLv3在注册表中禁用此默认值不会中断.
但是,我已经决定将所有应用程序升级到.NET 4.5并显式添加SecurityProtocolType.Tls | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls12;到所有应用程序的所有引导代码中.
这将使各种apis和服务的出站请求不降级,SSLv3并应选择最高级别TLS.
这种方法听起来合理还是矫枉过正?我有很多应用程序要更新,我希望将来证明它们,因为我听说甚至TLS 1.0可能在不久的将来被某些提供商弃用.
作为向API发出出站请求的客户端,在注册表中禁用SSL3是否会在.NET框架中产生影响?我默认看到,TLS 1.1和1.2没有启用,我们是否必须通过注册表启用它?RE http://support.microsoft.com/kb/245030.
经过一些调查后,我相信注册表设置将不会有任何影响,因为它们适用于IIS(服务器子项)和浏览器(客户端子项).
对不起,这篇文章变成了多个问题,接着是"可能"的答案.
我正在尝试使用客户端证书来使用Web API对设备进行身份验证和授权,并开发了一个简单的概念证明来解决潜在解决方案的问题.我遇到的问题是Web应用程序没有收到客户端证书.一些人报告了这个问题,包括在本问答中,但没有一个人有答案.我希望提供更多细节来重振这个问题,并希望得到我的问题的答案.我对其他解决方案持开放态度.主要要求是用C#编写的独立进程可以调用Web API并使用客户端证书进行身份验证.
此POC中的Web API非常简单,只返回单个值.它使用一个属性来验证是否使用了HTTPS以及是否存在客户端证书.
public class SecureController : ApiController
{
[RequireHttps]
public string Get(int id)
{
return "value";
}
}
Run Code Online (Sandbox Code Playgroud)
以下是RequireHttpsAttribute的代码:
public class RequireHttpsAttribute : AuthorizationFilterAttribute
{
public override void OnAuthorization(HttpActionContext actionContext)
{
if (actionContext.Request.RequestUri.Scheme != Uri.UriSchemeHttps)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
ReasonPhrase = "HTTPS Required"
};
}
else
{
var cert = actionContext.Request.GetClientCertificate();
if (cert == null)
{
actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden)
{
ReasonPhrase = "Client Certificate Required"
};
}
base.OnAuthorization(actionContext);
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这个POC中,我只是检查客户端证书的可用性.一旦这个工作,我可以添加证书中的信息检查,以验证证书列表. …
c# security client-certificates ssl-certificate asp.net-web-api
使用SSL证书进行SOAP调用时出现SSL错误:
请求已中止:无法创建SSL/TLS安全通道.
奇怪的是,如果我在Firefox中加载证书并访问端点或调用API而不发送任何数据,我不会收到任何错误消息并且连接成功.暴露API的公司也提到证书是犹太人的.
我正在加载的证书具有"Everyone"的完全权限.我已经尝试过我在互联网上看到的所有解决方案,但仍然遇到错误.
这是我创建请求的代码:
ServicePointManager.Expect100Continue = true;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
var request = (HttpWebRequest)WebRequest.Create(plugin.EndPoint);
request.ContentType = "text/xml; charset=utf-8";
request.Method = "POST";
Run Code Online (Sandbox Code Playgroud)
获取证书的代码(我也尝试过使用pfx):
var cert = new
509Certificate2(@"C:\clientcert.p12", "FakePassword");
request.ClientCertificates.Add(cert);
Run Code Online (Sandbox Code Playgroud)
和请求的代码:
byte[] byteArray = Encoding.UTF8.GetBytes(xml);
request.ContentLength = byteArray.Length;
using (var dataStream = request.GetRequestStream())
{
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
using (WebResponse response = request.GetResponse())
{
using (var responseStream = response.GetResponseStream())
{
StreamReader reader =
new StreamReader(responseStream ?? throw new InvalidOperationException());
return reader.ReadToEnd();
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
以下是运行请求的跟踪输出:
System.Net信息:0:[11844] InitializeSecurityContext(In-Buffers count = …