如何检查网站SSL证书有没有到期?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何检查网站SSL证书有没有到期?相关的知识,希望对你有一定的参考价值。

很多的网站都已经部署了SSL证书,SSL证书可以体现一个网站的安全性级别高不高。不过有的网站部署了SSL证书,但是不知怎么查看SSL证书的有效期时间,下面我们来简单的介绍一下怎么进行查看SSL证书有效期。

第一步:打开浏览器,在浏览器的地址栏地址之前有一个https的绿色开口说明已经部署了SSL证书

第二步:用鼠标点击对勾图标,再点击:证书详情

打开证书以后就能看到证书的一系列的信息了,颁发证书机构名字,有效期,颁发给哪里都有记录。

不同的浏览器有不一样的查看方法,不过用浏览器查看大致都是这样形式,只要自己细心都可以找到。

比如谷歌浏览器

方法1:点击浏览器地址栏绿色小锁,点击:证书。


方法2:打开HTTP网站,使用快捷键:Ctrl+Shift+I

参考技术A

这个很简单,直接在浏览器里打开查看SSL证书有效期就行了。

1、使用浏览器访问你的站点域名,然后单击地址栏上面的小锁图标进行查看


2、点击“证书”进行查看,然后就能看见有效期了

参考技术B 最直接的方法就是在浏览器中打开网网站,在域名左侧有一个标示“安全”字样的绿色挂锁,单击挂锁即可查看网站的证书信息,同时也会显示证书到期时间,如果显示证书即将过期,建议提早进行更新,避免用户到访时出现“不安全”提示,降低对网站的信赖。为避免出现这种情况,CA机构一般会向证书持有者不断发送提醒,因此服务器用户需要定期检查邮箱,以便及时发现,并通过证书颁发机构(CA机构)或者经销商申请SSL证书续费。以天威诚信为例,目前提供的EV/OV/DV产品,有效期时长397天,在证书到期前一个月会不间断的联系您进行证书的续期,保证您网站避免因证书到期带来的损失。本回答被提问者采纳

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

【中文标题】如何在 Java 中以编程方式检查 SSL 证书到期日期【英文标题】:how to check SSL certificate expiration date programmatically in Java 【发布时间】:2012-10-19 03:36:50 【问题描述】:

我需要从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;
        
    

问题是:

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

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

【问题讨论】:

尽管我要求使用 .NET,但 Google 仍会指向此处,因此我将在 C# 答案中添加 this link。 我必须在 for 循环之前添加 conn.connect(); 才能使此代码正常工作并停止接收 java.lang.IllegalStateException: connection not yet open 【参考方案1】:

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

将其发送至X509Certificate 并调用getNotAfter()

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

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

我怎么知道从哪个证书获取到期日期?

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

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

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

【讨论】:

我的应用程序是一个监控工具,具有监控 SSL 到期日期的功能,以便在到期时通知客户。所以我不在乎HTTPS是否安全,我只关心它什么时候到期。 “Java 应该已经为你做这一切”是什么意思? @Grace 我的意思是如果证书已经过期,它会抛出一个SSLHandshakeException。很难相信一个简单的日历条目根本不编写任何 Java 代码就无法实现这一目的。 感谢您的快速回复。我可以从 Certificate 转换为 X509Certificate。无论如何,我们的程序旨在自动监控一个证书的到期日期,并在它即将到期时通知管理员。我们的应用程序是一个监控系统,就像 nagios 等一样。就是这样。你确实帮了大忙:) @Grace 我明白了,玩得开心。【参考方案2】:

确保将 Begin/End 行附加到 PEM 格式,否则 java 无法理解它。

public class CertTest 

    public static final String cert = "-----BEGIN CERTIFICATE-----\n<CERT_DATA>\n-----END CERTIFICATE-----";

    public static void main(String[] args)
        try 
            X509Certificate myCert = (X509Certificate)CertificateFactory
                     .getInstance("X509")
                     .generateCertificate(
                                       // string encoded with default charset
                    new ByteArrayInputStream(cert.getBytes())
                     );
            System.out.println(myCert.getNotAfter());

         catch (Exception e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        

    

【讨论】:

问题中没有任何内容表明 Java 不理解证书格式。 这对我帮助很大【参考方案3】:

在 Kotlin 方式中,它应该看起来像这样:

fun certInformation(aURL: String) 
    val destinationURL = URL(aURL)
    val conn = destinationURL.openConnection() as HttpsURLConnection
    conn.connect()
    val certs = conn.serverCertificates
    for (cert in certs) 
        println("Certificate is: $cert")
        if (cert is X509Certificate) 
            println(cert.issuerDN.name)
            println(cert.notAfter)
            println(cert.notBefore)
        
    

【讨论】:

以上是关于如何检查网站SSL证书有没有到期?的主要内容,如果未能解决你的问题,请参考以下文章

使用python检查SSL证书到期情况

如何从 PEM 编码证书中确定 SSL 证书到期日期?

网站绿锁里面显示的ssl证书 在iis服务器证书列表里面找不到,请问这个证书是在哪儿绑定的

ssl证书怎么解决到期的问题

解决一次由于SSL证书到期导致的网站不能访问的问题(Nginx,php,Apache)

SSL数字证书到期之后该怎么做?