java.io.IOException:SSL握手失败:SSL库失败,通常是协议错误

时间:2011-03-09 18:36:06

标签: android url stream

我正在尝试使用来自服务器的给定链接的URL类下载一些内容。

我的下载代码是:

            URL url = new URL(downloadUrl);
            InputStream stream = url.openStream();
            byte[] content = new byte[stream.available()];
            stream.read(content);
            stream.close();

但是在跑步时我得到以下例外:

 java.io.IOException: SSL handshake failure: Failure in SSL library, usually a protocol error
 error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol (external/openssl/ssl/s23_clnt.c:604 0xaf076228:0x00000000)
     at org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl.nativeconnect(Native Method)
 ...

我使用的链接类似于:

https://contentserver.com/d/761/34/215656/5de1a41ea3bc9c81978af95ed19b03286f64d9a3

我知道如果我在浏览器上输入它,它会下载一个文件,我想通过Java下载相同的文件。

由于

3 个答案:

答案 0 :(得分:1)

从java中的https url读取数据的代码

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.net.*;
import java.security.Security;
import java.util.Properties;

public class UseHttps {

public static void main(String argv[]) {

String fullURL = "https://fortress.wa.gov/lni/bbip/detail.aspx?License=SIBLUCL004C5";
try {

    URL page = new URL(fullURL); // Process the URL far enough to find the right handler
    URLConnection urlc = page.openConnection();
    urlc.setUseCaches(false); // Don't look at possibly cached data
    System.out.println("Content-type = " + urlc.getContentType()); // See what's here
    System.out.println("Content-length = " + urlc.getContentLength()); // See how much of it there is
    // Read it all and print it out
    BufferedReader br = new BufferedReader(new InputStreamReader(urlc.getInputStream()));
    String buffer = "";
    while (buffer != null) {
        try {
            System.out.println(buffer);
            buffer = br.readLine();
        }
        catch (IOException ioe) {
            ioe.printStackTrace();
            break;
        }
    }
}
catch (MalformedURLException mue) {
System.out.println(fullURL + " is not a URL that can be resolved");
}
catch (IOException ie) {
ie.printStackTrace();
}
}
}

答案 1 :(得分:0)

马科斯,

这可能完全无关紧要,但是......我得到了同样的错误......

abort: error: _ssl.c:490: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol

...试图在我的bitbucket.org mercurial repo上做“hg clone” ...,我试图从windows命令行通过https连接到bitbucket ...它事实证明我向我的代理提供了错误的密码...

答案 2 :(得分:0)

虽然我不确定您的SSL错误,但您阅读数据的方式很可能不是您想要的。 InputStream.available()不是流中的数据量。根据定义,流是“无界限的”,只有当它结束时它才结束。 InputStream不知道它有多少字节。可用方法()只是告诉你可以在不阻塞IO的情况下读取多少字节。