【问题标题】:java https networking issuejava https网络问题
【发布时间】:2011-02-15 09:58:41
【问题描述】:

我正在尝试实现最简单的 HTTPS 通信程序。网上有很多例子,但是我没有运行成功。
下面是一个例子:

public class ReadHttpsURL1 {
   static final int HTTPS_PORT = 443; 

   public static void main(String argv[]) throws Exception {
       String url = "www.sun.com";
       System.setProperty("java.net.useSystemProxies", "true");

      SocketFactory factory = SSLSocketFactory.getDefault(); 

      Socket socket = factory.createSocket(url, HTTPS_PORT); 

      BufferedWriter out = new BufferedWriter(new 
            OutputStreamWriter(socket.getOutputStream()));
      BufferedReader in = new BufferedReader(
        new InputStreamReader(socket.getInputStream()));
      out.write("GET / HTTP/1.0\n\n");
      out.flush();

      String line;
      StringBuffer sb = new StringBuffer();
      while((line = in.readLine()) != null) {
         sb.append(line);
      }
      out.close();
      in.close();
      System.out.println(sb.toString());
   }
}

它挂断了大约一分钟(我相信是由于服务器端超时)并因错误而失败。挂断电话

Socket socket = factory.createSocket(url, HTTPS_PORT); 

错误是

Exception in thread "main" java.net.SocketException: Connection reset
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocksSocketImpl.readSocksReply(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.<init>(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketFactoryImpl.createSocket(Unknown Source)
    at com.sun.ex1.ReadHttpsURL1.main(ReadHttpsURL1.java:20)

这是第二个例子:

public class HttpsTest {

    public static void main(String[] args) throws MalformedURLException, IOException {
        System.setProperty("java.net.useSystemProxies", "true");

        URL url = new URL("https://www.sun.com");
        URLConnection con = url.openConnection();
        con.setAllowUserInteraction(true);
        InputStream is = new BufferedInputStream(con.getInputStream());
        for (int b = is.read(); b >= 0; b = is.read()) {
            System.out.write(b);
        }
    }
}

只要抛出这个异常:

Exception in thread "main" javax.net.ssl.SSLKeyException: RSA premaster secret error
    at com.sun.net.ssl.internal.ssl.RSAClientKeyExchange.<init>(Unknown Source)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloDone(Unknown Source)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)
    at HttpsTest.main(HttpsTest.java:16)
Caused by: java.security.NoSuchAlgorithmException: SunTlsRsaPremasterSecret KeyGenerator not available
    at javax.crypto.KeyGenerator.<init>(DashoA13*..)
    at javax.crypto.KeyGenerator.getInstance(DashoA13*..)
    at com.sun.net.ssl.internal.ssl.JsseJce.getKeyGenerator(Unknown Source)
    ... 14 more

我读过一些关于NoSuchAlgorithmException 的文章。这似乎与 sunjce_provider.jar
有关 我尝试了不同的变体来将此文件包含在类路径中,甚至使应用程序依赖于这个 jar(jar 肯定存在于类路径中)

HTTPS URL 是实时 URL。代理设置正常工作(否则会引发不同的连接异常)。
java版本“1.6.0_23”

这些错误是否相关?
任何想法如何解决?
感谢您的帮助!

【问题讨论】:

    标签: java


    【解决方案1】:

    我在我的 Eclipse IDE 上输入了上面的代码,它运行良好。 我认为您可能遇到的一个问题是您的代理服务器

    回复是:

    HTTP/1.1 301 Moved Permanently
    Server: Sun-Java-System-Web-Server/7.0
    Date: Fri, 25 Feb 2011 11:52:30 GMT
    P3p: policyref="http://www.sun.com/p3p/Sun_P3P_Policy.xml", CP="CAO DSP COR CUR ADMa DEVa TAIa PSAa PSDa CONi TELi OUR  SAMi PUBi IND PHY ONL PUR COM NAV INT DEM CNT STA POL PRE GOV"Location: http://www.oracle.com/us/sun
    Content-length: 0
    Connection: close
    

    我从你的代码中改变的只是这个 sn-p:

    System.setProperty("java.net.useSystemProxies", "false");
    

    只是我的猜测:

    • 您的网络实际上没有使用代理,但您打开了它,或者
    • 您的代理不支持 HTTPS 或
    • 您的用户的代理 HTTPS 支持已禁用(有意或无意)。

    曾经:

    如果您不打算编写低级库... 使用[来自 Apache 的 Http 组件][1] 怎么样?

    [1]:http://hc.apache.org/index.html

    【讨论】:

    【解决方案2】:

    此代码是您自己编写的还是从某个地方复制的?我只是问,因为这不是我通常建立 HTTPS 连接的方式。在测试 HTTPS 时,我要做的第一件事就是找到能够响应 HTTPS 请求的服务器。 www.sun.com 将重定向到 Oracle 页面,虽然这仍然有效,但它可能不是您想要的。
    我不能 100% 确定第一个,但我怀疑你正在遭受阻塞读取或写入。调试可能会有所帮助。
    我唯一一次看到堆栈跟踪是当 Java 5 和 6 的 JCE 类混合在一起并且 Java 版本无法应对时。 HttpsTest 中的相同代码“对我有用”

    【讨论】:

    • 我从网上获取代码。我还有几个例子也不起作用。我发过最简单的。我没有 5 和 6 java,但我已经安装了 JRE,并且必须安装 JDK,所以我在不同的地方同时拥有 JRE 和 JDK,但版本相同。 URL 也不是问题,我尝试过不同的没有重定向,比如encrypted.google.com。这肯定不是编程问题,而是某种配置问题。我试图弄清楚我缺少什么 JVM 配置。
    • 还有人认为这是 java 6 的问题,而不是 java 5 的问题。forums.oracle.com/forums/thread.jspa?messageID=6412248
    • 我会尝试的事情:寻找备用 SSL 提供程序(检查 bouncycastle.org),复制到 jre/lib/ext 并在 jre/lib/security/security.properties 中配置,或备份 jre /lib/ext/sunjce_provider.jar 并替换为其他人的副本
    • Issue with javax.net.ssl.SSLKeyException: RSA premaster secret error 在完全卸载 JDK 和 JRE,安装新的 JDK 1.6.0_24 后得到修复(JRE 开始自动安装JDK安装完成后。为什么?..)所以我还没有弄清楚在这种情况下是什么导致了问题。
    • 套接字问题是由代理引起的。如果我没有得到 java.net.ConnectException: Connection denied: connect (如果根本没有将 java 配置为使用代理)代理不应该引起问题,我的结论是错误的。在“来宾网络”(根本没有代理)中,应用程序似乎正在运行。事实证明,代理对每个协议都有不同的配置,而且我的公司政策不推荐使用原始套接字连接。
    【解决方案3】:

    套接字问题是由代理引起的。如果我没有得到 java.net.ConnectException: Connection denied: connect (如果根本没有配置代理)代理不应该引起问题,我的结论是错误的。在“来宾网络”(没有代理)中,应用程序似乎正在运行。事实证明,代理对每个协议都有不同的配置,而且我的公司政策不推荐使用原始套接字连接。

    【讨论】:

      猜你喜欢
      • 2011-07-04
      • 1970-01-01
      • 2017-06-18
      • 2013-05-25
      • 1970-01-01
      • 2017-09-26
      • 2015-06-02
      • 2013-08-21
      • 2016-03-15
      相关资源
      最近更新 更多