程序代码
//////////////////////////////////////////////////////////////////////////////////////////import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.SSLSocket;import com.sun.net.ssl.SSLContext;
import com.sun.net.ssl.TrustManager;
import com.sun.net.ssl.X509TrustManager;import java.net.URL;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Properties;
import java.io.IOException;
import java.io.*;
import java.net.MalformedURLException;
import javax.net.ssl.HandshakeCompletedEvent;
import javax.net.ssl.HandshakeCompletedListener;
public class SSLTest { public static void main(String args[])
{
X509TrustManager xtm = new MyTrustManager();
TrustManager mytm[] = {xtm};
SSLSocketFactory factory =null;
try{
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(null,mytm,null);
factory = ctx.getSocketFactory();
}catch(KeyManagementException e2)
{
e2.printStackTrace();
}catch(NoSuchAlgorithmException e3)
{
e3.printStackTrace();
}
String url="https://www.sun.com";
String proxy="172.25.75.2";
int port=8080;
URL server=null;
try{
socket =(SSLSocket)factory.createSocket(proxy, port);
System.out.println("Conntion succeed!");
}catch(UnknownHostException e1)
{
System.out.println("Conntion fail 1!");
e1.printStackTrace();
}catch(IOException e2)
{
System.out.println("Conntion fail 2!");
e2.printStackTrace();
}
try{
server=new URL(url);
}catch(MalformedURLException e)
{
e.printStackTrace();
} String getRequest = "GET " + server.toExternalForm()+"/index.html"+ " HTTP/1.1";
String hostSpecification = "Host: " + "www.sun.com";
System.out.println(server.toExternalForm());
System.out.println(server.getHost());
System.out.println(getRequest);
System.out.println(hostSpecification);
try
{ PrintWriter out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream()))); out.println(getRequest);
out.println(hostSpecification);
out.println();
out.flush(); if (out.checkError())
System.out.println("SSLSocketClient: java.io.PrintWriter error"); /* read response */
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream())); String inputLine;
while ((inputLine = in.readLine()) != null)
{
System.out.println(inputLine);
} in.close();
out.close();
socket.close(); }
catch(Exception e)
{
System.out.println("Conntion fail 3!");
e.printStackTrace();
}
}
}class MyTrustManager implements X509TrustManager
{
MyTrustManager()
{ // constructor
// create/load keystore
}
public void checkClientTrusted(X509Certificate chain[], String authType) throws CertificateException
{
System.out.println("1");
}
public void checkServerTrusted(X509Certificate chain[], String authType) throws CertificateException
{
System.out.println("2");
// special handling such as poping dialog boxes
}
public X509Certificate[] getAcceptedIssuers()
{
System.out.println("3");
return null;
}
public boolean isClientTrusted(X509Certificate chain[])
{
return true;
}
public boolean isServerTrusted(X509Certificate chain[])
{
return true;
}
}
异常
///////////////////////////////////////////////////////////////////////////////
Conntion succeed!
https://www.sun.com
www.sun.com
GET https://www.sun.com/index.html HTTP/1.1
Host: www.sun.com
SSLSocketClient: java.io.PrintWriter error
Conntion fail 3!
javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1154)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:65)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at SSLTest.main(SSLTest.java:118)
Caused by: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at com.sun.net.ssl.internal.ssl.InputRecord.handleUnknownRecord(InputRecord.java:501)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:343)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:720)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:619)
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336)
at sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer(StreamEncoder.java:404)
at sun.nio.cs.StreamEncoder$CharsetSE.implFlush(StreamEncoder.java:408)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:152)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:213)
at java.io.BufferedWriter.flush(BufferedWriter.java:236)
at java.io.PrintWriter.flush(PrintWriter.java:270)
at SSLTest.main(SSLTest.java:108)是什么原因? socket进行连接没有问题为什么用sslscoket会出现这样的错误?
//////////////////////////////////////////////////////////////////////////////////////////import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.SSLSocket;import com.sun.net.ssl.SSLContext;
import com.sun.net.ssl.TrustManager;
import com.sun.net.ssl.X509TrustManager;import java.net.URL;
import java.net.UnknownHostException;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.Properties;
import java.io.IOException;
import java.io.*;
import java.net.MalformedURLException;
import javax.net.ssl.HandshakeCompletedEvent;
import javax.net.ssl.HandshakeCompletedListener;
public class SSLTest { public static void main(String args[])
{
X509TrustManager xtm = new MyTrustManager();
TrustManager mytm[] = {xtm};
SSLSocketFactory factory =null;
try{
SSLContext ctx = SSLContext.getInstance("SSL");
ctx.init(null,mytm,null);
factory = ctx.getSocketFactory();
}catch(KeyManagementException e2)
{
e2.printStackTrace();
}catch(NoSuchAlgorithmException e3)
{
e3.printStackTrace();
}
String url="https://www.sun.com";
String proxy="172.25.75.2";
int port=8080;
URL server=null;
try{
socket =(SSLSocket)factory.createSocket(proxy, port);
System.out.println("Conntion succeed!");
}catch(UnknownHostException e1)
{
System.out.println("Conntion fail 1!");
e1.printStackTrace();
}catch(IOException e2)
{
System.out.println("Conntion fail 2!");
e2.printStackTrace();
}
try{
server=new URL(url);
}catch(MalformedURLException e)
{
e.printStackTrace();
} String getRequest = "GET " + server.toExternalForm()+"/index.html"+ " HTTP/1.1";
String hostSpecification = "Host: " + "www.sun.com";
System.out.println(server.toExternalForm());
System.out.println(server.getHost());
System.out.println(getRequest);
System.out.println(hostSpecification);
try
{ PrintWriter out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(
socket.getOutputStream()))); out.println(getRequest);
out.println(hostSpecification);
out.println();
out.flush(); if (out.checkError())
System.out.println("SSLSocketClient: java.io.PrintWriter error"); /* read response */
BufferedReader in = new BufferedReader(
new InputStreamReader(socket.getInputStream())); String inputLine;
while ((inputLine = in.readLine()) != null)
{
System.out.println(inputLine);
} in.close();
out.close();
socket.close(); }
catch(Exception e)
{
System.out.println("Conntion fail 3!");
e.printStackTrace();
}
}
}class MyTrustManager implements X509TrustManager
{
MyTrustManager()
{ // constructor
// create/load keystore
}
public void checkClientTrusted(X509Certificate chain[], String authType) throws CertificateException
{
System.out.println("1");
}
public void checkServerTrusted(X509Certificate chain[], String authType) throws CertificateException
{
System.out.println("2");
// special handling such as poping dialog boxes
}
public X509Certificate[] getAcceptedIssuers()
{
System.out.println("3");
return null;
}
public boolean isClientTrusted(X509Certificate chain[])
{
return true;
}
public boolean isServerTrusted(X509Certificate chain[])
{
return true;
}
}
异常
///////////////////////////////////////////////////////////////////////////////
Conntion succeed!
https://www.sun.com
www.sun.com
GET https://www.sun.com/index.html HTTP/1.1
Host: www.sun.com
SSLSocketClient: java.io.PrintWriter error
Conntion fail 3!
javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1154)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:65)
at sun.nio.cs.StreamDecoder$CharsetSD.readBytes(StreamDecoder.java:411)
at sun.nio.cs.StreamDecoder$CharsetSD.implRead(StreamDecoder.java:453)
at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)
at java.io.InputStreamReader.read(InputStreamReader.java:167)
at java.io.BufferedReader.fill(BufferedReader.java:136)
at java.io.BufferedReader.readLine(BufferedReader.java:299)
at java.io.BufferedReader.readLine(BufferedReader.java:362)
at SSLTest.main(SSLTest.java:118)
Caused by: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?
at com.sun.net.ssl.internal.ssl.InputRecord.handleUnknownRecord(InputRecord.java:501)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:343)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:720)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1025)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:619)
at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59)
at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336)
at sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer(StreamEncoder.java:404)
at sun.nio.cs.StreamEncoder$CharsetSE.implFlush(StreamEncoder.java:408)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:152)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:213)
at java.io.BufferedWriter.flush(BufferedWriter.java:236)
at java.io.PrintWriter.flush(PrintWriter.java:270)
at SSLTest.main(SSLTest.java:108)是什么原因? socket进行连接没有问题为什么用sslscoket会出现这样的错误?
SSLSocket socket=null;