java8

代码如下:


import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLSession;
import java.net.URL;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.concurrent.*;

public class SSLCertMonitor {

    // 检查间隔时间(单位:小时)
    private static final long CHECK_INTERVAL_HOURS = 12;
    // 到期阈值(单位:天)
    private static final long EXPIRY_THRESHOLD_DAYS = 30;

    public static void main(String[] args) {
        List<String> domainList = Arrays.asList(
                "https://www.baidu.com"
        );

        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        Runnable checkTask = () -> checkAllDomains(domainList);

        // 初次执行立即运行,以后每12小时执行一次
//        scheduler.scheduleAtFixedRate(checkTask, 0, CHECK_INTERVAL_HOURS, TimeUnit.HOURS);
    }

    private static void checkAllDomains(List<String> domains) {
        System.out.println("\n==== SSL证书检测开始 " + new Date() + " ====");
        for (String domain : domains) {
            try {
                checkCertificate(domain);
            } catch (Exception e) {
                System.err.println("检测 " + domain + " 失败: " + e.getMessage());
            }
        }
        System.out.println("==== SSL证书检测结束 ====\n");
    }

    private static void checkCertificate(String httpsUrl) throws Exception {
        URL url = new URL(httpsUrl);
        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setConnectTimeout(10000);
        connection.connect();

        Certificate[] certs = connection.getServerCertificates();

        for (Certificate cert : certs) {
            if (cert instanceof X509Certificate) {
                X509Certificate x509Cert = (X509Certificate) cert;
                Instant now = Instant.now();
                Instant expire = x509Cert.getNotAfter().toInstant();
                long daysLeft = ChronoUnit.DAYS.between(now, expire);

                System.out.printf("域名: %-25s 剩余天数: %3d 到期时间: %s%n",
                        httpsUrl, daysLeft, x509Cert.getNotAfter());

                if (daysLeft <= EXPIRY_THRESHOLD_DAYS) {
                    System.out.printf("⚠️ 警告:%s 证书将在 %d 天后过期!%n", httpsUrl, daysLeft);
                }
                break; // 通常第一个就是目标证书
            }
        }
        connection.disconnect();
    }
}
作者:张三  创建时间:2025-11-10 14:11
最后编辑:张三  更新时间:2025-11-10 14:13