|
使用jdk自带的keystore,里面包含官方的证书,主流网站都有,自己的可以使用keytool导入
C:\Program Files\Java\jdk1.8.0_144/jre/lib/security/cacerts 默认密码changeit
直接运行就能看到网页源码
import java.net.*;
import java.io.*;
import javax.net.ssl.*;
import javax.security.cert.X509Certificate;
import java.security.KeyStore;
import java.util.Arrays;
/*
* This example shows how to set up a key manager to do client
* authentication if required by server.
*
* This program assumes that the client is not inside a firewall.
* The application can be modified to connect to a server outside
* the firewall by following SSLSocketClientWithTunneling.java.
*/
public class SSLSocketClientWithClientAuth {
public static void main(String[] args) throws Exception {
String host = null;
int port = -1;
String path = null;
// for (int i = 0; i < args.length; i++)
// System.out.println(args[i]);
// if (args.length < 3) {
// System.out.println("USAGE: java SSLSocketClientWithClientAuth host port requestedfilepath");
// System.exit(-1);
// }
try {
// host = args[0];
// port = Integer.parseInt(args[1]);
// path = args[2];
host = "github.com";
// host = "blog.csdn.net";
// host = "www.baidu.com";
port = 443;
path = "/";
} catch (IllegalArgumentException e) {
System.out.println("USAGE: java SSLSocketClientWithClientAuth host port requestedfilepath");
System.exit(-1);
}
try {
/*
* Set up a key manager for client authentication
* if asked by the server. Use the implementation's
* default TrustStore and secureRandom routines.
*/
SSLSocketFactory factory = null;
try {
SSLContext ctx;
KeyManagerFactory kmf;
KeyStore ks;
char[] passphrase = "changeit".toCharArray();
ctx = SSLContext.getInstance("TLS");
kmf = KeyManagerFactory.getInstance("SunX509");
ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("C:\\Program Files\\Java\\jdk1.8.0_144" + "/jre/lib/security/cacerts"), passphrase);
kmf.init(ks, passphrase);
ctx.init(kmf.getKeyManagers(), null, null);
factory = ctx.getSocketFactory();
} catch (Exception e) {
throw new IOException(e.getMessage());
}
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
/*
* send http request
*
* See SSLSocketClient.java for more information about why
* there is a forced handshake here when using PrintWriters.
*/
System.out.println("start https request:" + host + " " + port + " " + path);
socket.startHandshake();
PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())));
out.println("GET " + path + " HTTP/1.1");
out.println("Host: " + host);
out.println();
out.flush();
/*
* Make sure there were no surprises
*/
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) {
e.printStackTrace();
}
}
} |
————————————————
原文链接:https://blog.csdn.net/c5113620/article/details/80441327
程序猿的技术大观园:www.javathinker.net
|
|