如何获取服务器证书链,然后validation它在Java中是否有效和可信
我需要与远程服务器创建Https连接,然后检索并validation证书。
我建立了良好的连接:
try { url = new URL(this.SERVER_URL); HttpURLConnection con = (HttpURLConnection) url.openConnection(); HttpsURLConnection secured = (HttpsURLConnection) con; secured.connect(); }
但似乎getServerCertificateChain()
方法未定义类型为HttpsURLConnection
。
那么如何检索服务器证书链? 我的理解是getServerCertificateChain()
应返回一个X509Certificate
对象的数组,并且该类具有可用于查询证书的方法。
我需要validation:
- 证书有效且值得信赖,
- 根据证书序列号检查证书吊销列表分发点
- 确保它没有过期
- 检查证书中的URL是否与另一个(我已经检索过)匹配。
我迷路了,真的很感激任何帮助!
您需要的方法是getServerCertificates ,而不是getServerCertificateChain
。 这里有一些不错的示例代码。
编辑
添加了一些我自己的示例代码。 对你来说是一个很好的起点 不要忘记查看HttpsURLConnection和X509Certificate的Javadocs。
import java.net.URL; import java.security.cert.Certificate; import java.security.cert.CertificateExpiredException; import java.security.cert.X509Certificate; import javax.net.ssl.HttpsURLConnection; public class TestSecuredConnection { /** * @param args */ public static void main(String[] args) { TestSecuredConnection tester = new TestSecuredConnection(); try { tester.testConnectionTo("https://www.google.com"); } catch (Exception e) { e.printStackTrace(); } } public TestSecuredConnection() { super(); } public void testConnectionTo(String aURL) throws Exception { URL destinationURL = new URL(aURL); HttpsURLConnection conn = (HttpsURLConnection) destinationURL .openConnection(); conn.connect(); Certificate[] certs = conn.getServerCertificates(); for (Certificate cert : certs) { System.out.println("Certificate is: " + cert); if(cert instanceof X509Certificate) { try { ( (X509Certificate) cert).checkValidity(); System.out.println("Certificate is active for current date"); } catch(CertificateExpiredException cee) { System.out.println("Certificate is expired"); } } } } }
快速的谷歌搜索让我使用BouncyCastle这个例子。 我认为最好回答这个问题。 http://www.nakov.com/blog/2009/12/01/x509-certificate-validation-in-java-build-and-verify-chain-and-verify-clr-with-bouncy-castle/