Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSL处理异常java.lang.ArrayIndexOutOfBoundsException:64与JDK 1.4.2_19时出错_Java_Security_Ssl_Jsse - Fatal编程技术网

SSL处理异常java.lang.ArrayIndexOutOfBoundsException:64与JDK 1.4.2_19时出错

SSL处理异常java.lang.ArrayIndexOutOfBoundsException:64与JDK 1.4.2_19时出错,java,security,ssl,jsse,Java,Security,Ssl,Jsse,首先,我不能更新我的史前JDK,这是不可能的。 我必须使用JDK 1.4.219,因为它是Weblogic 8.1在非solaris平台上支持的最新JDK,而且我无法更新应用程序服务器(升级或迁移成本太高) 因此,我尝试在JDK 1.4.219下使用以下代码(它只是一个测试类)建立SSL连接: System.setProperty("https.proxyHost", proxyHost); System.setProperty("https.proxyPort", ""+proxyPort);

首先,我不能更新我的史前JDK,这是不可能的。 我必须使用JDK 1.4.219,因为它是Weblogic 8.1在非solaris平台上支持的最新JDK,而且我无法更新应用程序服务器(升级或迁移成本太高)

因此,我尝试在JDK 1.4.219下使用以下代码(它只是一个测试类)建立SSL连接:

System.setProperty("https.proxyHost", proxyHost);
System.setProperty("https.proxyPort", ""+proxyPort);
URL url = new URL (request);
SSLServerSocketFactory ssf = (SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
SSLServerSocket ss = (SSLServerSocket)ssf.createServerSocket();

SSLContext context = SSLContext.getInstance("SSL");
context.init(null, trustManager, new SecureRandom()); // bypass certificate

SSLSocketFactory sf = context.getSocketFactory();
HttpsURLConnection.setDefaultSSLSocketFactory(sf);

HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();

connection.setSSLSocketFactory(sf);
connection.setHostnameVerifier(new TrustAllHostNameVerifier ()); // bypass certificate

connection.setRequestMethod("GET");
connection.setDoOutput(true);
InputStream content = (InputStream)connection.getInputStream();
BufferedReader in = new BufferedReader (new InputStreamReader (content));
String line;
while ((line = in.readLine()) != null) {
    System.out.println(line);
}
此代码产生以下错误:

main, handling exception: java.lang.ArrayIndexOutOfBoundsException: 64
main, SEND TLSv1 ALERT:  fatal, description = internal_error
main, WRITE: TLSv1 Alert, length = 2
main, called closeSocket()
javax.net.ssl.SSLException: java.lang.ArrayIndexOutOfBoundsException: 64
    at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.a(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.b(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(DashoA12275)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(DashoA12275)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(DashoA12275)
    at     sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:620)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(DashoA12275)
    at xxx.test(TestJava14.java:162)
    at xxx.TestJava14.main(TestJava14.java:85)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 64
    at com.sun.net.ssl.internal.ssl.SunJSSE_bf.a(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SunJSSE_bf.a(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SunJSSE_ax.a(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SunJSSE_ax.c(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SunJSSE_ax.a(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SunJSSE_az.a(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SunJSSE_az.a(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SunJSSE_ax.a(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA12275)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.j(DashoA12275)
    ... 8 more
在对这个错误进行了数小时的研究后,我试图:

  • 将BouncyCastleProvider与代码一起使用 addProvider(新的BouncyCastleProvider()); 在java.security中,使用 security.provider.2=org.bouncycastle.jce.provider.BouncyCastleProvider

  • 从旧WAS服务器(lib ibmjsseprovider2.jar)使用IBMJSProvider security.provider.2=com.ibm.jsse2.ibmjsseprovider 2但不能与sun JDK一起使用,我得到一个例外:ibmjsseprovider 2构建级别:-20040601 java.lang.RuntimeException:导出限制:仅SunJSSE

  • 禁用java.security中的DHE算法: jdk.tls.disabledAlgorithms=DHE

  • 强制一个应该工作的密码套件(已成功安装无限策略文件): 字符串[]CipherSuite={“TLS\U RSA\U WITH_AES\U 256\U CBC\U SHA”}; ss.可设置的密码套件(密码套件); (事实上,我还尝试了JSSE参考指南中提供的所有密码套件)


您正在将SSL与信任管理器一起使用,该信任管理器忽略了服务器证书的来源和
TrustAllHostNameVerifier
。这与普通测试相同。只要抛开安全性的伪装,使用纯HTTP即可。正是这种不负责任的编码给了互联网一个坏名声。此外,即使你要解决这些问题,密码列表也相当。。。稀疏的其中,没有一个被认为是安全的,也没有一个是现代的、安全的、支持SSL的服务器所允许的
SSL\u RSA\u WITH_3DES\u EDE\u CBC\u SHA
实际上是唯一可以被视为远程安全的密码,即使这样它也不提供。@Boristespider:1.4.*2**根据Q中的链接添加了一些不错的密码套件。但是对于DHE,j4(甚至j7)将大小限制为1024位,这对于斯诺登邮报日志堵塞服务器来说可能太小了。Ben:jdk.tls.disabledAlgoriths仅为j7+,SSLServerSocket上的SetEnablediPhone与用于HttpsURLConnection的套接字完全无关;而是为每个链接使用属性https.ciphersuites。但我怀疑是DHE导致了这个错误。。。。。。我会考虑让古java处理这个问题,并通过代理将HTTP转换为HTTP(如SQUID、ValNeX、HAXPROX、NGIX或Apache),或者通过TCP到TLS中继(StimelNever)。服务器可以有多个不同PK算法的证书,并发送一个适合所选密码套件的证书。例如,使用不同的ClientHellos,我可以从
google.com:443
(74.125.22.multive)获得ECDSA和RSA证书,但不能从
www.google.com:443
(172.217.4.multive)获得。您使用SSL时,信任管理器会忽略服务器证书的来源和
TrustAllHostNameVerifier
。这与普通测试相同。只要抛开安全性的伪装,使用纯HTTP即可。正是这种不负责任的编码给了互联网一个坏名声。此外,即使你要解决这些问题,密码列表也相当。。。稀疏的其中,没有一个被认为是安全的,也没有一个是现代的、安全的、支持SSL的服务器所允许的
SSL\u RSA\u WITH_3DES\u EDE\u CBC\u SHA
实际上是唯一可以被视为远程安全的密码,即使这样它也不提供。@Boristespider:1.4.*2**根据Q中的链接添加了一些不错的密码套件。但是对于DHE,j4(甚至j7)将大小限制为1024位,这对于斯诺登邮报日志堵塞服务器来说可能太小了。Ben:jdk.tls.disabledAlgoriths仅为j7+,SSLServerSocket上的SetEnablediPhone与用于HttpsURLConnection的套接字完全无关;而是为每个链接使用属性https.ciphersuites。但我怀疑是DHE导致了这个错误。。。。。。我会考虑让古java处理这个问题,并通过代理将HTTP转换为HTTP(如SQUID、ValNeX、HAXPROX、NGIX或Apache),或者通过TCP到TLS中继(StimelNever)。服务器可以有多个不同PK算法的证书,并发送一个适合所选密码套件的证书。例如,使用不同的ClientHello,我可以从
google.com:443
(74.125.22.多个)--但不能从
www.google.com:443
(172.217.4.多个)获得ECDSA和RSA证书。