现在已经发现SSL 3容易受到POODLE攻击:
System.Net.WebRequest在连接到任何https Uri时使用哪些版本的SSL/TLS?
我使用WebRequest连接到多个第三方API.其中一个已经表示他们将阻止使用SSL 3的任何请求.但是WebRequest是.Net核心框架的一部分(使用4.5),因此它使用的版本并不明显.
我有一个C#PayTrace网关的问题.下面的代码工作正常,直到昨天我认为他们因为Poodle Exploit而关闭了SSL3.运行下面的代码时,我们得到以下消息.远程服务器已强制关闭连接.在对该问题进行一些研究后,我们确定由于我们的IIS Server 7.5配置为仍使用SSL3,因此C#默认为SSL3,PayTrace会强行关闭连接.然后,我们从服务器中删除了SSL3.然后导致以下错误:
客户端和服务器无法通信,因为它们没有通用算法.
我的猜测是,我们需要在服务器上安装额外的SSL算法,因为SSL 3已被删除.我们的IT人员声称TLS 1.1和TLS 1.2正在运行,ASP.NET现在应该默认为那些.但我觉得我们还需要在服务器上安装其他东西,我不了解SSL算法,所以我不知道从哪里开始.
var postUrl = new StringBuilder();
//Initialize url with configuration and parameter values...
postUrl.AppendFormat("UN~{0}|", this.MerchantLoginID);
postUrl.AppendFormat("PSWD~{0}|", this.MerchantTransactionKey);
postUrl.Append("TERMS~Y|METHOD~ProcessTranx|TRANXTYPE~Sale|");
postUrl.AppendFormat("CC~{0}|", cardNumber);
postUrl.AppendFormat("EXPMNTH~{0}|", expirationMonth.PadLeft(2, '0'));
postUrl.AppendFormat("EXPYR~{0}|", expirationYear);
postUrl.AppendFormat("AMOUNT~{0}|", transactionAmount);
postUrl.AppendFormat("BADDRESS~{0}|", this.AddressLine1);
postUrl.AppendFormat("BADDRESS2~{0}|", this.AddressLine2);
postUrl.AppendFormat("BCITY~{0}|", this.City);
postUrl.AppendFormat("BSTATE~{0}|", this.State);
postUrl.AppendFormat("BZIP~{0}|", this.Zip);
postUrl.AppendFormat("SADDRESS~{0}|", this.AddressLine1);
postUrl.AppendFormat("SADDRESS2~{0}|", this.AddressLine2);
postUrl.AppendFormat("SCITY~{0}|", this.City);
postUrl.AppendFormat("SSTATE~{0}|", this.State);
postUrl.AppendFormat("SZIP~{0}|", this.Zip);
if (!String.IsNullOrEmpty(this.Country))
{
postUrl.AppendFormat("BCOUNTRY~{0}|", this.Country);
}
if (!String.IsNullOrEmpty(this.Description))
{
postUrl.AppendFormat("DESCRIPTION~{0}|", this.Description);
}
if (!String.IsNullOrEmpty(this.InvoiceNumber))
{
postUrl.AppendFormat("INVOICE~{0}|", this.InvoiceNumber);
}
if (this.IsTestMode)
{
postUrl.AppendFormat("TEST~Y|");
}
//postUrl.Append();
WebClient …Run Code Online (Sandbox Code Playgroud) 我们在android中编写了客户端应用程序,它使用HttpsUrlConnection apis与https服务器连接.由于Poodle漏洞,我们需要在调用任何请求时从启用的协议列表中禁用SSLv3.
我们遵循oracle捕获的指南,如http://www.oracle.com/technetwork/java/javase/documentation/cve-2014-3566-2342133.html
并在调用url连接之前添加了以下行
java.lang.System.setProperty("https.protocols", "TLSv1");
Run Code Online (Sandbox Code Playgroud)
这个解决方案适用于普通的java程序.尝试连接仅适用于SSLv3协议的服务器时,我们收到了SSLHandShakeException.
但值得关注的是:同样的修复不适用于Android.我错过了什么或者我应该为Android尝试另一种方法吗?请建议.
关于POODLE漏洞,如果我理解正确,它需要客户端在未能与使用服务器通告的更高版本协议的服务器建立安全通道时自动将TLS协议降级为SSLv3.
常见的Java HTTP客户端库,特别是javax.net.ssl.HttpsURLConnection和Apache HttpClient,在无法与服务器建立TLS会话时会自动降级TLS协议吗?如果没有,我是否正确他们不受POODLE攻击的影响,除非(a)服务器仅支持SSLv3,或(b)更高级别的逻辑执行降级?
我正在寻找像http://blog.hagander.net/archives/222-A-few-short-notes-about-PostgreSQL-and-POODLE.html这样的东西,但是对于Java客户端.
由于POODLE漏洞,我在Amazon AWS中托管的服务器不再支持SSLv3.
因此,我的Android应用程序对服务器执行的第一个HTTPS连接会在建立连接时导致错误.
Error reading server response: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x77d8ab68: Failure in SSL library, usually a protocol error
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:741 0x7339ad74:0x00000000)
[....]
Caused by: javax.net.ssl.SSLHandshakeException: javax.net.ssl.SSLProtocolException: SSL handshake aborted: ssl=0x77d8ab68: Failure in SSL library, usually a protocol error
error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure (external/openssl/ssl/s23_clnt.c:741 0x7339ad74:0x00000000)
at com.android.org.conscrypt.OpenSSLSocketImpl.startHandshake(OpenSSLSocketImpl.java:448)
at com.android.okhttp.Connection.upgradeToTls(Connection.java:146)
at com.android.okhttp.Connection.connect(Connection.java:107)
at com.android.okhttp.internal.http.HttpEngine.connect(HttpEngine.java:294)
at com.android.okhttp.internal.http.HttpEngine.sendSocketRequest(HttpEngine.java:255)
at com.android.okhttp.internal.http.HttpEngine.sendRequest(HttpEngine.java:206)
Run Code Online (Sandbox Code Playgroud)
该错误仅在第一个请求中发生.后续请求工作了一段时间.
为了解决这个问题,我试图从Android客户端接受的协议列表中删除SSL,并确保我只使用TLS.为此,我设置了一个自定义SSLSocketFactory,它从启用的协议和支持的密码套件列表中删除SSL.
/**
* SSLSocketFactory that wraps one existing SSLSocketFactory and delegetes into it …Run Code Online (Sandbox Code Playgroud) ssl android amazon-web-services sslsocketfactory poodle-attack
在我的java代码中,我正在使用命令创建一个SSL Context实例
SSLContext ctx = SSLContext.getInstance("TLS");
Run Code Online (Sandbox Code Playgroud)
但在我的tomcat服务器中,我正在设置TLSv1.2,我收到握手错误.
我们如何使用这种方法支持所有TLS协议,就像在cpp中一样,我们有SSLV23客户端方法,它将支持所有协议.
自Java 8 Update 31以来,由于SSL协议中的安全漏洞,默认情况下禁用SSL 3协议(请参阅POODLE攻击).
即使不推荐,如何启用它?
由于Poodle攻击,现在建议为客户端和服务器应用程序禁用SSLv3,并且仅允许TLS 1.0 -TLS 1.2连接.
有没有办法在计算机上为所有基于Java的应用程序(服务器和客户端)禁用SSLv3而无需修改每个Java程序?
可能有可能更改JRE的配置或使用特殊的环境变量.
有人知道这样的方式吗?
我有使用一些Web服务并通过JSON获取数据的应用程序,所有工作都运行良好很长时间,直到最新发现有关SSLv3容易受到中间人攻击并且服务器所有者关闭SSLv3 .我的应用程序开始出现连接问题并返回错误"请求已中止:无法建立安全的SSL/TLS连接".我试图寻找解决方案并找到信息,我必须在创建Web请求之前添加此代码:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
ServicePointManager.ServerCertificateValidationCallback = delegate{
return true;
};
Run Code Online (Sandbox Code Playgroud)
不幸的是,这里没有运气,app的行为和以前一样,我不知道这段代码什么都不做,或者服务器还有问题.错误信息非常模糊,我有问题找出出错的地方.
这是我的代码
...
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.ContentType = GetRequestContentType();
request.Method = method.ToString();
request.Credentials = GetCredential(url);
request.PreAuthenticate = true;
CookieContainer cookieContainer = new CookieContainer();
request.CookieContainer = cookieContainer;
...
Run Code Online (Sandbox Code Playgroud)
我想问一下如何设置Tls12作为默认值,并确保在我的最终请求中我使用所需的协议.
如果我确认我的应用程序在我的最终工作正常,是否有办法从服务器响应中获取更详细的信息并找出错误的确切原因?
感谢所有的答案和建议.
编辑
问题的第二部分已经解决,我发现这个工具http://www.telerik.com/download/fiddler它几乎允许查看传出和传入数据的情况.此工具还允许解码SSL连接,启用此选项可使我的应用程序开始工作.我假设这个应用程序可以实现我的应用程序和目标主机之间的通信.但我仍然不知道它可能是什么.以及如何使我的应用程序自己正确处理这些连接.
嗨我想在客户端使用SSLV23方法支持多个版本的TLS.但是我无法连接获取错误:
SSL23_GET_SERVER_HELLO:sslv3警报握手失败
任何人都可以告诉我如何使用openssl支持多个版本的TLS?
SSLV23的代码片段(不工作)
cctx = SSL_CTX_new(SSLv23_client_method());
if(cctx) {
SSL_CTX_set_options(cctx, SSL_OP_NO_SSLv3);
}
Run Code Online (Sandbox Code Playgroud)
仅适用于TLS V1(工作)
cctx = SSL_CTX_new(TLSv1_client_method());
Run Code Online (Sandbox Code Playgroud) 现在已经发现SSL 3容易受到POODLE攻击:
System.Web.Services.Protocols.SoapHttpClientProtocol在连接到任何https Uri时使用的是什么版本的SSL/TLS?
我使用SoapHttpClientProtocol连接到几个第三方SOAP API.其中一个已经表示他们将阻止任何使用SSL 3的请求.但SoapHttpClientProtocol是.Net核心框架的一部分(使用4.5),因此它使用的SSL版本或如何覆盖版本并不明显.
请注意,此问题与System.Net.WebRequest支持哪些版本的SSL/TLS不重复?.我使用了几个API,一些是REST(另一个问题是针对那些),有些是SOAP(这个问题适用于那些)
我正在尝试在Apache中禁用SSLv3,我已经通过xampp安装在Windows上.但我无法弄清楚如何.有人告诉我,我需要补充一下
SSLProtocol All -SSLv2 -SSLv3
Run Code Online (Sandbox Code Playgroud)
到我的ssl配置文件,但我不知道它在哪里.
我看到了
C:\xampp\apache\conf\extra\httpd-ssl.conf
Run Code Online (Sandbox Code Playgroud)
但是从研究中我听说我正在寻找一个似乎不存在的ssl.conf文件.
有任何想法吗?
编辑也,从我正在阅读的教程,我仍然不知道在配置文件中我将SSLProtocol All -SSLv2 -SSLv3放在哪里,如果我能够找到配置文件.