JAVA https ssl 连接验证服务端证书
By:Roy.LiuLast updated:2015-03-26
在服务端部署的应用,很多情况下是采用HTTPS SSL 方式,这种方式唯一的好处是数据在通过浏览器传输到 web application server 之间是加密的,一般不容易破解。有时候需要另外一个客户端:比如是Android 应用用https 方式去调用 API , 从安全性角度考虑,服务端颁发的证书授权的域名或者IP或者主机名,应该与客户端请求的URL 是一致的。如果不一致,就可能存在安全隐患。
一般这种情况是在单向HTTPS 的情况才考虑,因为只有服务端证书,而没有客户端证书, 所以才需要验证客户端请求的URL 与服务端 证书授权的域名等是否一致。
看上去有点多此一举,但有些特例的情况下还是会用到, 它的一个基本思路是,首先是信任所有服务端的证书,连接上之后,再去获得证书的信息,然后对比请求的URL ,后面就是你自己的逻辑,想怎么玩就怎么玩, 下面是一段DEMO 代码
一般这种情况是在单向HTTPS 的情况才考虑,因为只有服务端证书,而没有客户端证书, 所以才需要验证客户端请求的URL 与服务端 证书授权的域名等是否一致。
看上去有点多此一举,但有些特例的情况下还是会用到, 它的一个基本思路是,首先是信任所有服务端的证书,连接上之后,再去获得证书的信息,然后对比请求的URL ,后面就是你自己的逻辑,想怎么玩就怎么玩, 下面是一段DEMO 代码
package com.test.www;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.security.cert.CertPath;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
public class Test1 {
public static void main(String args[]) throws Exception {
HostnameVerifier hv = new HostnameVerifier() {
public boolean verify(String urlHostName, SSLSession session) {
System.out.println("Warning: URL Host: " + urlHostName
+ " vs. " + session.getPeerHost());
return true;
}
};
trustAllHttpsCertificates();
HttpsURLConnection.setDefaultHostnameVerifier(hv);
SSLSocketFactory factory = HttpsURLConnection
.getDefaultSSLSocketFactory();
SSLSocket socket = (SSLSocket) factory.createSocket("portal.xxxxx.com",
9443);// portal.xxxxx.com 192.168.1.15
socket.startHandshake();
SSLSession session = socket.getSession();
// String sslHost = session.getPeerHost();
// String host = "portal.xxxxx.com";
// System.out.println("Host=" + host);
// System.out.println("SSL Host=" + sslHost);
// if (host.equals(sslHost)) {
// System.out.println("good");
// } else {
// System.out.println("bad");
// }
java.security.cert.Certificate[] servercerts = session
.getPeerCertificates();
for (int i = 0; i < servercerts.length; i++) {
X509Certificate c = (X509Certificate) servercerts[i];
System.out.println(getValByAttributeTypeFromIssuerDN(c.getSubjectDN().toString(), "CN="));
}
}
private static String getValByAttributeTypeFromIssuerDN(String dn,
String attributeType) {
String[] dnSplits = dn.split(",");
for (String dnSplit : dnSplits) {
if (dnSplit.contains(attributeType)) {
String[] cnSplits = dnSplit.trim().split("=");
if (cnSplits[1] != null) {
return cnSplits[1].trim();
}
}
}
return "";
}
private static void trustAllHttpsCertificates() throws Exception {
javax.net.ssl.TrustManager[] trustAllCerts = new javax.net.ssl.TrustManager[1];
javax.net.ssl.TrustManager tm = new miTM();
trustAllCerts[0] = tm;
javax.net.ssl.SSLContext sc = javax.net.ssl.SSLContext
.getInstance("SSL");
sc.init(null, trustAllCerts, null);
javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(sc
.getSocketFactory());
}
static class miTM implements javax.net.ssl.TrustManager,
javax.net.ssl.X509TrustManager {
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
public boolean isServerTrusted(
java.security.cert.X509Certificate[] certs) {
return true;
}
public boolean isClientTrusted(
java.security.cert.X509Certificate[] certs) {
return true;
}
public void checkServerTrusted(
java.security.cert.X509Certificate[] certs, String authType)
throws java.security.cert.CertificateException {
return;
}
public void checkClientTrusted(
java.security.cert.X509Certificate[] certs, String authType)
throws java.security.cert.CertificateException {
return;
}
}
}
From:一号门
Next:jquery 动态创建form 并提交

COMMENTS