java https网络问题

java https网络问题,java,Java,我正在尝试实现最简单的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

我正在尝试实现最简单的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)
只需抛出此异常:

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
线程“main”javax.net.ssl.SSLKeyException中的异常:RSA premaster机密错误 位于com.sun.net.ssl.internal.ssl.RSAClientKeyExchange。(未知来源) 位于com.sun.net.ssl.internal.ssl.ClientHandshaker.serverHelloDone(未知来源) 位于com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(未知源) 位于com.sun.net.ssl.internal.ssl.Handshaker.processLoop(未知源) 位于com.sun.net.ssl.internal.ssl.Handshaker.process_记录(未知源) 位于com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(未知源) 位于com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(未知源) 位于com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(未知源) 位于com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(未知源) 位于sun.net.www.protocol.https.HttpsClient.afterConnect(未知来源) 位于sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(未知源) 位于sun.net.www.protocol.http.HttpURLConnection.getInputStream(未知源) 位于sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(未知源) 位于HttpsTest.main(HttpsTest.java:16) 原因:java.security.NoSuchAlgorithmException:SuntlSrsAspRemasterSecret密钥生成器不可用 在javax.crypto.KeyGenerator(DashoA13*) 位于javax.crypto.KeyGenerator.getInstance(DashoA13*) 位于com.sun.net.ssl.internal.ssl.JsseJce.getKeyGenerator(未知源) ... 14多 我读过一点关于他的书。这似乎与sunjce_provider.jar有关
我尝试了不同的变体将此文件包含在类路径中,甚至使应用程序依赖于此jar(jar肯定存在于类路径中)

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

这些错误是否相关?
有什么好办法吗?

谢谢你的帮助

这段代码是你自己写的还是从什么地方复制的?我之所以这么问,是因为这不是我通常建立HTTPS连接的方式。测试HTTPS时,我要做的第一件事是查找将响应HTTPS请求的服务器。www.sun.com将重定向到Oracle页面,虽然此页面仍然有效,但可能不是您想要的页面。
我不能100%肯定第一个问题,但我怀疑您正在遭受读写阻塞。调试可能会有所帮助。

我唯一一次看到堆栈跟踪是当Java5和Java6的JCE类混合在一起,Java版本无法处理时。HttpsTest中的相同代码“适合我”

我在EclipseIDE上键入了上述代码,并且运行良好。 我认为您可能会遇到的一个问题是代理服务器的问题

答复是:

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
我从您的代码中更改的只是以下代码片段:

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

  • 您在那里的网络实际上不使用代理,但您已将其打开,或者
  • 您的代理不支持HTTPS或
  • 您对用户的代理HTTPS支持已禁用(有意或无意)
是:

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

[1] :


套接字问题是由代理引起的。若我并没有得到java.net.ConnectException,我的结论是错误的:连接被拒绝:连接(若根本并没有配置代理)代理不应该引起问题。在“来宾网络”(无代理)中,应用程序似乎正在运行。事实证明,代理对每个协议都有不同的配置,我的公司政策不赞成原始套接字连接。

我从网络上获取了代码。我还有几个例子也不起作用。我发了一封信。我没有5和6 java,但我已经安装了JRE,并且必须安装JDK,所以我在不同的地方安装了JRE和JDK,但版本相同。另外URL也不是问题,我尝试过不同的无重定向,比如。这当然不是编程问题,而是配置问题。我正试图找出我缺少的JVM配置。还有人认为这是Java6的问题,而不是Java5的问题。我会尝试的事情:查找备用SSL提供程序(检查bouncycastle.org),复制到jre/lib/ext并在jre/lib/security/security.properties中进行配置,或者备份jre/lib/ext/sunjce_provider.jar并替换为其他人的副本。请使用javax.net.ssl.SSLKeyException:RSA premaster secret错误在完全卸载JDK和jre、安装新的JDK 1.6.0_24后得到修复(jre在JDK安装完成后开始自动安装。为什么?)所以我还没有弄清楚是什么导致了这个问题。套接字的问题是由代理引起的。若我并没有得到java.net.ConnectException,我的结论是错误的:连接被拒绝:连接(若并没有将java配置为使用代理)代理不应该引起问题。在“来宾网络”(完全没有代理)中,应用程序似乎正在工作。事实证明,代理对每种协议都有不同的配置,我公司的政策反对原始套接字连接。最初的想法是实现最简单的应用程序,自动将安全证书导入java公共存储。我发现了使用套接字的实现,但它似乎不适合我。我开始四处挖掘。
System.setProperty("java.net.useSystemProxies", "false");