首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Java中获取服务器证书链并验证其有效性和可信性

如何在Java中获取服务器证书链并验证其有效性和可信性
EN

Stack Overflow用户
提问于 2011-08-26 09:26:05
回答 3查看 41.7K关注 0票数 20

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

我已经很好地建立了连接:

代码语言:javascript
复制
try {  
    url = new URL(this.SERVER_URL);  
    HttpURLConnection con = (HttpURLConnection) url.openConnection();   
    HttpsURLConnection secured = (HttpsURLConnection) con;  
    secured.connect(); 
}  

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

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

我需要验证一下:

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

我迷路了,真的很感谢大家的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-26 09:43:56

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

编辑

添加了一些我自己的示例代码。这对你来说是一个很好的起点。不要忘记查看HttpsURLConnectionX509Certificate的Javadoc。

代码语言:javascript
复制
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");
                }
            }
        }
    }
}
票数 29
EN

Stack Overflow用户

发布于 2013-04-17 04:24:47

通过快速搜索,我找到了使用BouncyCastle的示例。我认为它更好地回答了这个问题。http://www.nakov.com/blog/2009/12/01/x509-certificate-validation-in-java-build-and-verify-chain-and-verify-clr-with-bouncy-castle/

票数 2
EN

Stack Overflow用户

发布于 2018-12-02 23:42:35

Kirby和arulraj.net提到的这个示例代码已经在2011年从Apache CXF中删除,并且不支持OCSP。Apache PDFBox项目“复活”了这段代码,并添加了OCSP支持和原始代码中缺失的更多功能,例如CRL签名检查。从2.0.13版本开始,改进的源代码可以在examples子项目中的CertificateVerifier类中获得。它也是有一些小改进的available online

代码并不声称是完美的,并且还没有检查根是否可信。在JIRA issue PDFBOX-3017中跟踪了开发情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7199129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档