java - 如何在 Java 中以编程方式检查 SSL 证书到期日期

标签 java ssl https httpclient ssl-certificate

我需要从Java网站上的SSL证书中提取到期日期,应该同时支持 受信任和自签名证书,例如: 1.信任 https://github.com 2.自签 https://mms.nw.ru/

我已经复制了一些代码:

import java.net.URL;
import java.security.SecureRandom;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public class SSLTest {

    public static void main(String [] args) throws Exception {
        // configure the SSLContext with a TrustManager
        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);

        URL url = new URL("https://github.com");//https://mms.nw.ru
        HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
        conn.setHostnameVerifier(new HostnameVerifier() {
            @Override
            public boolean verify(String arg0, SSLSession arg1) {
                return true;
            }
        });
        System.out.println(conn.getResponseCode());
        Certificate[] certs = conn.getServerCertificates();
        for (Certificate cert :certs){
            System.out.println(cert.getType());
            System.out.println(cert);
        }

        conn.disconnect();
    }

    private static class DefaultTrustManager implements X509TrustManager {

        @Override
        public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {}

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    }
}

问题是:

  1. 如何从证书中解析过期日期,在我的代码中 toString() 确实输出了日期,但是很难解析。

  2. 如何确定证书链,例如链3的github证书,我怎么知道从哪个证书获取过期日期?

最佳答案

How to parse the expiration date from the certificate

将其转换为 X509Certificate 并调用 getNotAfter()

How to determine the certificate chain, eg, the github certificate with chains

你明白了。这就是 Certificate[] 数组,正如它在 Javadoc 中所说的那样。 .

How did i know which certificate to get the expiration date from?

阅读 Javadoc . “对等方自己的证书首先是任何证书颁发机构”。

但是我不知道你为什么要这样做。 Java 应该已经为您完成了这一切。

请丢弃不安全且不正确的 TrustManager 实现。处理自签名证书的正确方法是将它们导入客户端信任库。还请扔掉不安全的 HostnameVerifier,并使用默认的或安全的。如果您不希望 HTTPS 安全,为什么还要使用它?

关于java - 如何在 Java 中以编程方式检查 SSL 证书到期日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12967016/

相关文章:

c# - 不使用自定义域名时加载 Azure 证书

.net - Servicestack,保障流量

php - 用户登录后将所有网页重定向到 HTTPS?

java - 如何对 JSP 和通过单独进程发送的电子邮件使用相同的内容?

java - ActiveMQ 在 Spring Boot 中延迟传递消息

java - 在 fragment 的 GridView 中显示从 Firebase 下载的图像在打开 fragment 时不断崩溃

docker - 如何在 Docker 镜像中的 .Net Core 项目中启动 Kestrel

php - 如何在 HTTP 服务中进行身份验证?

ruby-on-rails - 生产模式下的 SSL 连接错误 Rails 3.2.3 瘦服务器

java - 从 Java 中的不同类追加到私有(private) TextArea