不灭的火

革命尚未成功,同志仍须努力下载JDK17

作者:AlbertWen  添加时间:2025-06-02 16:15:19  修改时间:2025-06-03 11:17:33  分类:07.Java框架/系统  编辑

Hutool是一个Java工具库,它提供了简单的方法来获取网站的SSL证书信息,包括到期时间。以下是使用Hutool获取SSL证书到期时间的几种方法:

方法一:使用Hutool的HttpUtil

import cn.hutool.core.date.DateUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.http.ssl.TrustAnyHostnameVerifier;

import javax.net.ssl.HttpsURLConnection;
import java.security.cert.X509Certificate;
import java.util.Date;

public class HutoolSSLCertCheck {
    public static void main(String[] args) {
        String domain = "example.com"; // 替换为你要检查的域名
        
        try {
            // 创建不验证主机名的连接
            HttpsURLConnection conn = HttpUtil.createHttps(domain)
                    .setHostnameVerifier(new TrustAnyHostnameVerifier())
                    .getConnection();
            
            // 获取证书
            X509Certificate cert = (X509Certificate) conn.getServerCertificates()[0];
            Date expiryDate = cert.getNotAfter();
            
            System.out.println("域名: " + domain);
            System.out.println("证书到期时间: " + DateUtil.formatDateTime(expiryDate));
            System.out.println("剩余天数: " + 
                ((expiryDate.getTime() - System.currentTimeMillis()) / (1000 * 60 * 60 * 24)));
            
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

方法二:使用Hutool的SSL工具类(更简洁)

import cn.hutool.core.date.DateUtil;
import cn.hutool.http.ssl.TrustAnyHostnameVerifier;
import cn.hutool.socket.SSLUtil;

import javax.net.ssl.SSLSocket;
import java.security.cert.X509Certificate;
import java.util.Date;

public class HutoolSSLCertCheck2 {
    public static void main(String[] args) {
        String host = "example.com"; // 替换为你要检查的域名
        int port = 443; // HTTPS默认端口
        
        try {
            SSLSocket sslSocket = SSLUtil.createSSLSocket(host, port);
            sslSocket.startHandshake();
            
            X509Certificate cert = (X509Certificate) sslSocket.getSession().getPeerCertificates()[0];
            Date expiryDate = cert.getNotAfter();
            
            System.out.println("域名: " + host);
            System.out.println("证书到期时间: " + DateUtil.formatDateTime(expiryDate));
            System.out.println("剩余天数: " + 
                ((expiryDate.getTime() - System.currentTimeMillis()) / (1000 * 60 * 60 * 24)));
            
            sslSocket.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

注意事项

  1. 自签名证书处理:上述代码使用了TrustAnyHostnameVerifier来跳过主机名验证,这在处理自签名证书时很有用,但在生产环境中可能会带来安全风险12。

  2. 证书链:某些网站可能有多个证书(证书链),代码中只获取了第一个证书(服务器证书),如果需要检查整个证书链,可以遍历conn.getServerCertificates()数组12。

  3. 性能考虑:如果需要频繁检查大量域名的证书状态,建议使用连接池并考虑异步处理。

  4. 错误处理:实际应用中应该添加更完善的错误处理逻辑,比如超时设置、重试机制等。