当前位置: 首页 > 面试题库 >

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

梁丘俊材
2023-03-14
问题内容

我需要从Java网站上的SSL证书中提取到期日期,应同时支持受信任和自签名证书,例如:1.trusted
https://github.com 2.self-signed 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证书,我怎么知道从哪个证书获取有效期?


问题答案:

如何从证书中解析到期日期

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

如何确定证书链,例如带有链的github证书

知道了
Certificate[]正如Javadoc中所说,这就是数组。

我怎么知道要从哪个证书获取有效期?

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

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

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



 类似资料:
  • 问题内容: 如果我在Mac或Linux中拥有实际的文件和Bash shell,如何查询cert文件何时到期?假设我有csr,key,pem和chain文件,则不是网站,而是证书文件本身。 问题答案: 与: 输出形式为: 以了解如何轻松地检查证书是否已过期,或者证书是否将在一定时间段内,而不必解析上述日期。

  • 如果我在Mac或Linux中有实际的文件和Bash shell,我如何查询证书文件何时过期?不是web站点,而是证书文件本身,假设我有csr、key、pem和chain文件。

  • 我目前正在使用SSL编写一个网络TCP服务器。在生产中,我们最终将要求客户机使用证书进行身份验证。 为了在紧急情况下撤销证书,我们还希望建立CRL。 编辑:删除过时的Dropbox链接

  • 问题内容: 我目前正在使用SSL编写网络TCP服务器。在生产中,我们最终将要求客户使用证书进行身份验证。 为了在紧急情况下吊销证书,我们还想建立一个CRL。 我的问题是:Java是否开箱即用地检查CRL(如果提供了证书),还是需要手动实施此类检查? 为了进行测试,我准备了带有CRL设置的证书,但是Java似乎没有尝试对其进行验证(我将其放入本地Web服务器中并且无法访问)。 我仅找到 _com.s

  • 我试图在woocommerce中安排保存(发布)帖子时的销售期。 我试过下面两种方法,但都不起作用。代码在正确的时间被调用,只是没有更新post meta。 这两种方法都没有更新销售计划。

  • 我有一个要求,通知客户,他们的证书将在一些日子过期,所以在那之前续订工作TLS加密工作预期。 如何检索PEM格式证书的到期时间?