有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

x509certificate如何获取服务器证书链,然后在Java中验证其有效性和受信任性

我需要创建一个与远程服务器的Https连接,然后检索并验证证书

我已经建立了连接:

try {  
    url = new URL(this.SERVER_URL);  
    HttpURLConnection con = (HttpURLConnection) url.openConnection();   
    HttpsURLConnection secured = (HttpsURLConnection) con;  
    secured.connect(); 
}  

但是getServerCertificateChain()方法似乎没有被类型HttpsURLConnection定义

那么如何检索服务器证书链呢?我的理解是getServerCertificateChain()应该返回一个X509Certificate对象数组,这个类有我可以用来查询证书的方法

我需要核实:

  1. 证书有效且受信任
  2. 根据证书序列号检查证书吊销列表分发点
  3. 确保它没有过期,并且
  4. 检查证书中的URL是否与另一个(我已经检索到)匹配

我迷路了,非常感谢您的帮助


共 (3) 个答案

  1. # 1 楼答案

    您想要的方法是getServerCertificates,而不是getServerCertificateChain。有一些很好的示例代码here


    编辑

    添加了一些我自己的示例代码。对你来说,这是一个很好的起点。别忘了查看HttpsURLConnectionX509Certificate的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");
                    }
                }
            }
        }
    }
    
  2. # 2 楼答案

    这是Kirby和arulraj提到的示例代码。net已于2011年从Apache CXF中删除,不支持OCSP。{a1}项目“复活”了这段代码,并添加了OCSP支持和原始代码中缺少的更多功能,例如CRL签名检查。自2.0.13版以来,在CertificateVerifier类的示例子项目中提供了改进的源代码。它也是available online,有一些小的改进

    该代码并不声称是完美的,也没有检查根目录是否可信。JIRA第PDFBOX-3017期跟踪了发展情况