62,625
社区成员
发帖
与我相关
我的任务
分享
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URL;
import java.security.Key;
import java.security.KeyStore;
import java.security.Security;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.text.SimpleDateFormat;
import java.util.Enumeration;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import java.util.*;
import java.io.*;
import sun.security.mscapi.SunMSCAPI;
public class Demo {
public static final String PWD = "ghwolf";
public static final String REQUEST_URL = "https://localhost:8443";
// 如果不设置这个,那么证书颁发给那个域名,就必须访问哪个域名,否则验证不通过。使用这个后无论证书颁发给谁,都可以使用任意ip或域名进行访问,但也会非常不安全。
static HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
System.out.println("Warning: URL Host: " + urlHostName + " vs. " + session.getPeerHost());
return true;
}
};
public static void main(String args[]) throws Exception {
System.setProperty("https.protocols", "TLSv1,TLSv1.1,TLSv1.2,SSLv3");
SSLSocketFactory sslSocketFactory = getSslSocketFactory();
Scanner scan = new Scanner(System.in);
System.out.println("请输入指令,\n1:打印当前系统证书 。\n2:请求。\n ...");
while(scan.hasNextInt()) {
int i = scan.nextInt();
switch(i) {
case 1 : print(); break ;
case 2 : conn(sslSocketFactory) ; break ;
default : System.out.println("none ...");
}
}
}
static void conn(SSLSocketFactory sslSocketFactory) {
try {
String query = "name=value";
byte[] input = "Hello World.".getBytes();
URL url = new URL(REQUEST_URL);
System.out.println(url);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
connection.setHostnameVerifier(hv);
// 如果用http注释掉这一行
connection.setSSLSocketFactory(sslSocketFactory);
connection.setRequestMethod("GET");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setDoOutput(input != null);
// if (input != null) {
// OutputStream out = connection.getOutputStream();
// out.write(input);
// out.flush();
// out.close();
// }
ByteArrayOutputStream baos = new ByteArrayOutputStream();
InputStream in = connection.getInputStream();
copy(in, baos);
System.out.println("status:" + connection.getResponseCode());
System.out.println("data:" + baos.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
// 信任所有证书
static class miTM implements TrustManager, X509TrustManager {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(X509Certificate[] certs) {
return true;
}
public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
return;
}
public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
return;
}
}
public static SSLSocketFactory getSslSocketFactory() throws Exception {
String clientKeyStoreFile = "E:\\User\\Ghwolf\\Desktop\\ssl\\client.p12";
String clientKeyStorePwd = PWD;
String clientKeyPwd = PWD;
// String clientTrustKeyStoreFile = "E:\\User\\Ghwolf\\Desktop\\ssl\\client.truststore";
// String clientTrustKeyStorePwd = PWD;
KeyStore clientKeyStore = KeyStore.getInstance("JKS");
clientKeyStore.load(new FileInputStream(clientKeyStoreFile), clientKeyStorePwd.toCharArray());
// KeyStore clientKeyStore = fun();
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(clientKeyStore, clientKeyPwd.toCharArray());
// KeyStore clientTrustKeyStore = KeyStore.getInstance("JKS");
// clientTrustKeyStore.load(new FileInputStream(clientTrustKeyStoreFile), clientTrustKeyStorePwd.toCharArray());
// TrustManagerFactory trustManagerFactory = TrustManagerFactory
// .getInstance(TrustManagerFactory.getDefaultAlgorithm());
// trustManagerFactory.init(clientTrustKeyStore);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
TrustManager[] trustAllCerts = new TrustManager[1];
TrustManager tm = new miTM();
trustAllCerts[0] = tm;
sslContext.init(keyManagerFactory.getKeyManagers(), trustAllCerts, null);
// sslContext.init(keyManagerFactory.getKeyManagers(),trustManagerFactory.getTrustManagers(), null);
return sslContext.getSocketFactory();
}
public static void copy(InputStream in, OutputStream out) throws IOException {
byte[] buffer = new byte[512];
int n = -1;
while ((n = in.read(buffer)) != -1) {
out.write(buffer, 0, n);
}
in.close();
out.close();
}
public static KeyStore fun() {
SunMSCAPI providerMSCAPI = new SunMSCAPI();
Security.addProvider(providerMSCAPI);
KeyStore ks;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null);
// Enumeration aliases = ks.aliases();
// while (aliases.hasMoreElements()) {
// String alias = (String) aliases.nextElement();
// Certificate[] certs = ks.getCertificateChain(alias);
// if (certs != null) {
// System.out.println("证书链:" + alias + "':");
// for (int c = 0; c < certs.length; c ++) {
// if (certs[c] instanceof X509Certificate) {
// X509Certificate cert = (X509Certificate) certs[c];
// System.out.println(cert.getPublicKey());
// System.out.println(ks.getKey(alias, "123456".toCharArray()));
// System.out.println(" 顺序: " + (c + 1) + ":");
// System.out.println(" 主题: " + cert.getSubjectDN());
// System.out.println(" 签名算法: " + cert.getSigAlgName());
// System.out.println(" 签发时间: " + sdf.format(cert.getNotBefore()));
// System.out.println(" 到期时间: " + sdf.format(cert.getNotAfter()));
// System.out.println(" 签发者: " + cert.getIssuerDN());
// }
// }
// }
// }
} catch (Exception e) {
throw new RuntimeException(e);
}
return ks ;
}
public static void print() {
SunMSCAPI providerMSCAPI = new SunMSCAPI();
Security.addProvider(providerMSCAPI);
KeyStore ks;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null);
Enumeration aliases = ks.aliases();
while (aliases.hasMoreElements()) {
String alias = (String) aliases.nextElement();
Certificate[] certs = ks.getCertificateChain(alias);
if (certs != null) {
System.out.println("证书链:" + alias + "':");
for (int c = 0; c < certs.length; c ++) {
if (certs[c] instanceof X509Certificate) {
X509Certificate cert = (X509Certificate) certs[c];
System.out.println(cert.getPublicKey());
// System.out.println(ks.getKey(alias, PWD.toCharArray()));
System.out.println(" 顺序: " + (c + 1) + ":");
System.out.println(" 主题: " + cert.getSubjectDN());
System.out.println(" 签名算法: " + cert.getSigAlgName());
System.out.println(" 签发时间: " + sdf.format(cert.getNotBefore()));
System.out.println(" 到期时间: " + sdf.format(cert.getNotAfter()));
System.out.println(" 签发者: " + cert.getIssuerDN());
}
}
}
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
