1,708
社区成员
代码如下:
测试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程序才可以吗?