1,711
社区成员
发帖
与我相关
我的任务
分享代码如下:
测试hostname = "www.sspu.edu.cn"时可以获得服务器证书信息,而hostname = "idp.sspu.edu.cn" 却拿不到证书信息,如果使用浏览器的话,两个地址都是可以访问的。
经过多次测试,我发现www.sspu.edu.cn网站不需要 startHandshake()就可以取到证书信息,而idp.sspu.edu.cn在startHandshake()时,却报“PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target” 错误。
import java.io.*;
import java.util.*;
import java.security.cert.*;
import javax.net.ssl.*;
public class XuGetCertFromServer {
public static void main(String args[ ])throws Exception {
int port = 443;
String hostname ="idp.sspu.edu.cn";
SSLSocketFactory factory =
HttpsURLConnection.getDefaultSSLSocketFactory();
SSLSocket socket = (SSLSocket)factory.createSocket(hostname, port);
// Connect to the server
//socket.startHandshake();
SSLSession session=socket.getSession();
// Retrieve the server's certificate chain
java.security.cert.Certificate[] servercerts =
session.getPeerCertificates();
List mylist = new ArrayList();
for(int i=0;i<servercerts.length;i++){
mylist.add(servercerts[i]);
}
CertificateFactory cf = CertificateFactory.getInstance("X.509");
CertPath cp = cf.generateCertPath(mylist);
System.out.println(cp);
FileOutputStream f=new FileOutputStream("CertPath.dat");
ObjectOutputStream b=new ObjectOutputStream(f);
b.writeObject(cp);
}
}
该问题已经解决,自己的问题自己回复一下吧!
1、握手失败是因为对方服务器证书有问题,一般存在两个问题:1. 证书过期; 2. 证书链不全。
2、如果不握手的话,是无法取得对方证书信息的。
但是,我是问题还没有解决,因为我的需求是检查对方网站的证书,如果有问题给出问题,如过期或证书链不全的警告。
目前查阅的资料是,用操作系统curl命令是能够满足需要的,curl执行结果会返回NSS error -8181 (SEC_ERROR_EXPIRED_CERTIFICATE) 和 NSS error -8179 (SEC_ERROR_UNKNOWN_ISSUER)错误信息。 但用java程序,不知道该如何实现,难道必须再写一个handshake程序才可以吗?