我正在尝试执行此powershell命令
Invoke-WebRequest -Uri https://apod.nasa.gov/apod/
我收到这个错误."Invoke-WebRequest:请求已中止:无法创建SSL/TLS安全通道." https请求似乎有效(" https://google.com ")但不是这个问题.如何让它工作或使用其他powershell命令来读取页面内容?
我需要使用TLS 1.2从我的.NET Web服务连接到另一个将强制TLS 1.2的服务.我找到了一个资源,说.NET 4.6默认使用TLS 1.2,这听起来像最简单的解决方案.我在服务器上更新了.NET框架并重新启动.在IIS中,我尝试使用.NET 4.6创建应用程序池,但4.0是唯一的选择.然后我发现了一些东西说它仍然会说4.0因为4.6是对.NET 4.0的"到位"更新.所以我想也许我已经完成了.然而,在我出于无关原因的错误页面上,它表示Microsoft .NET Framework Version:4.0.30319我似乎没有成功升级.有关如何确保我的应用程序池使用.NET 4.6的更多指针,或更一般地说如何启用TLS 1.2?
我正在尝试使用OAuth身份验证来获取Salesforce身份验证令牌,所以我提到了wiki文档,但在获得授权代码后,当我发出带有5个必需参数的Post请求时,我遇到了以下异常
{"error":"invalid_grant","error_description":"authentication failure"} CODE 400
JSON = {"error":"invalid_grant","error_description":"authentication failure"}
Run Code Online (Sandbox Code Playgroud)
这是一个糟糕的要求.
PostMethod post = new PostMethod("https://login.salesforce.com/services/oauth2/token");
post.addParameter("code",##############);
post.addParameter("grant_type","authorization_code");
post.addParameter("redirect_uri","#################");
post.addParameter("client_id",this.client_id);
post.addParameter("client_secret",this.client_secret);
httpclient.executeMethod(post);
String responseBody = post.getResponseBodyAsString();
System.out.println(responseBody+" CODE "+post.getStatusCode());
Run Code Online (Sandbox Code Playgroud)
如果有例外,请回复
我正在开发一个ASP.NET Web应用程序,它使用HttpWebRequest向另一台服务器发送请求.它通过HTTPS发送请求,远程服务器需要客户端证书.请求在.NET应用程序中失败,显然无法发送正确的客户端证书.我是能够成功连接并发送客户端证书,如果我只需访问URL以网页浏览器(Chrome明确).
下面的代码是一个简单的再现,只有一个基本的GET请求.
var r = WebRequest.Create(url) as HttpWebRequest;
r.ClientCertificates = new X509CertificateCollection { myX509Cert };
using (var resp = r.GetResponse() as HttpWebResponse) {
...
}
Run Code Online (Sandbox Code Playgroud)
我得到了我们最喜欢的例外,"无法创建SSL/TLS安全通道".通常,这些类型的问题指向证书私钥的权限问题.我尝试了所有我能想到的东西,以确保这一切都正确配置,但也许我错过了一些东西.简而言之,远程服务器正在发送一个TLS CertificateRequest,其列表似乎正确地标识了我的客户端证书,但我的应用程序无法响应任何客户端证书.
这是我的设置:
这是我尝试过的一切,以及我所知道的:
HasPrivateKey= truePreAuthenticate = true在请求对象中设置.没有什么区别ServicePointManager.Expect100Continue = false,没有什么区别ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3,但显然远程服务器需要TLS,所以没有帮助ServicePointManager.ServerCertificateValidationCallback委托总是返回true.但是,在TLS握手中,它甚至在调用此委托之前就失败了我添加了System.Net跟踪,看到了这个: …
在我们的Windows 2012 Server R2上,我们需要禁用TLS 1.0.
但是我们运行.NET 4.5 Wcf服务.我们发现,如果我们禁用TLS 1.0,WCF服务不再运行,因为我们收到错误"现有连接被远程主机强行关闭".
.NET 4.5和.NET 4.5.1中是否默认启用了TLS 1.1/1.2?如果没有,我们假设是这样的,我们在WCF项目中强制项目使用TLS 1.1/1.2?
使用RestSharp和TLS 1.1有任何已知问题吗?我们目前使用RestSharp将发布请求发送给供应商.此供应商不再接受TLS 1.0连接并更改为TLS 1.1.
问题是当他们从TLS 1.0切换到TLS 1.1然后我们不再使用RestSharp代码.
我在2008 R2(在启用1.1和1.2的注册表设置之后)以及Windows 8.1上测试了这个.他们切换到TLS 1.1,RestResponse是:
"基础连接已关闭:发送时发生意外错误"
切换回TLS 1.0,没问题.我已经测试过使用谷歌浏览器访问他们的网站,它确实显示了TLS 1.1,因此服务器和客户端工作站能够使用TLS 1.1.它似乎只是RestSharp的问题......
关于这一点有很多帖子,我已经搜索过它们,但仍然没有解决方案.我希望有人可以指出我正确的方向.
我们现在要求使用TLS 1.2连接到远程提供程序.所以我安装了Windows Server 2016并根据需要进行了配置:
我知道远程服务器正在运行TLS 1.2并且它支持突出显示的密码.
我们使用由提供程序提供的WSDL生成的C#代理类连接到远程端点 - 然后将它们的结尾转换为TLS(System.Web.Services.Protocols.SoapHttpClientProtocol).
当我使用代理连接时,我得到一个异常,内部异常是"客户端和服务器无法通信,因为它们没有通用算法".
我无法看到ServicePointManager.SecurityProtocol的任何地方,所以我假设.NET正在拿起TLS 1.2,因为它是唯一启用的协议?不知道它是如何做密码的.
有人能告诉我我是如何尝试解决这个问题的吗?如果可能,我不想重新生成WSDL代理类.
我做了大量的研究,没有找到任何合适的答案.这是场景.
我有一个编译为目标.NET Framework 4的应用程序.在运行时,我希望该应用程序实际在.NET Framework 4.6.1中执行.到目前为止我找到了两个选项.
选项1是不可取的,因为它需要重新发布软件.
选项2没有达到我的预期.它似乎检查是否安装了CLR 4.0(不是框架4.0),如果没有提示下载适当的SKU来安装它.安装后,应用程序仍在.NET Framework 4.0下执行
作为测试,以及发布此问题的原因,我创建了一个小型控制台应用程序,它只是这样做
Console.WriteLine(System.Net.ServicePointManager.SecurityProtocol);
Run Code Online (Sandbox Code Playgroud)
如果是针对.NET Framework 4编译的,则输出为
Ssl3,Tls
如果是针对.NET Framework 4.6.1编译的,则输出为
Tls,Tls11,Tls12
所以我试图在我的服务器上关闭TLS 1.0和1.1.当我关闭TLS 1.0时,我的应用程序中出现以下错误:
System.ServiceModel.Security.SecurityNegotiationException: The caller was not authenticated by the service. ---> System.ServiceModel.FaultException: The request for security token could not be satisfied because authentication failed.
at System.ServiceModel.Security.SecurityUtils.ThrowIfNegotiationFault(Message message, EndpointAddress target)
at System.ServiceModel.Security.SspiNegotiationTokenProvider.GetNextOutgoingMessageBody(Message incomingMessage, SspiNegotiationTokenProviderState sspiState)
Run Code Online (Sandbox Code Playgroud)
启用TLS 1.0后一切正常.
现在,调用该服务的代码使用ServicePointManager以下代码指定TLS 1.2 :ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
另一端的服务正在运行.Net 4.6.2,并没有指定使用的TLS协议ServicePointManager,因此根据我的阅读,它将自动检测在此版本的.net框架中运行时需要哪个TLS协议.
有关绑定的WCF服务的Web.config如下
呼叫配置:
<basicHttpBinding>
<binding name="MyBinding" closeTimeout="00:02:00" openTimeout="00:02:00" receiveTimeout="00:02:00" sendTimeout="00:02:00"/>
</basicHttpBinding>
<netTcpBinding>
<binding name="CrossDomainBinding">
<security mode="Message">
<message clientCredentialType="Certificate"/>
</security>
</binding>
</netTcpBinding>
<client>
<endpoint address="net.tcp://MyService.svc"
binding="netTcpBinding" bindingConfiguration="CrossDomainBinding" behaviorConfiguration="CrossDomainBehavior"
contract="MyContract" name="MyBinding">
<identity>
<certificate …Run Code Online (Sandbox Code Playgroud) 我对RestSharp提出了一个非常简单的Web请求:
var client = new RestClient("https://website.net");
var request = new RestRequest("/process", Method.GET);
request.AddParameter("cmd", "execute");
IRestResponse response = client.Execute(request);
var content = response.Content;
Console.WriteLine("Response: " + content);
Run Code Online (Sandbox Code Playgroud)
这将返回错误消息:
该请求已中止:无法创建SSL / TLS安全通道
三件事:
他们的证书使用的是TLS 1.2和AES 128,因此它与RC4引起的错误无关。
这是在Visual Studio 2015中的本地Win 10计算机上,目标框架为.NET 4.5.2。
为什么会出现此错误?
编辑:
通过更改代码以使用基本System.Net和WebRequest类并添加以下行:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
Run Code Online (Sandbox Code Playgroud)
正如从这里建议的那样,它有效。所以我猜RestSharp由于某种原因使用了错误的协议?
.net ×5
c# ×5
ssl ×5
restsharp ×2
tls1.2 ×2
wcf ×2
certificate ×1
client ×1
clr ×1
force.com ×1
oauth-2.0 ×1
post ×1
powershell ×1
salesforce ×1
wsdl ×1