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(); } } }
注意事项
-
自签名证书处理:上述代码使用了
TrustAnyHostnameVerifier
来跳过主机名验证,这在处理自签名证书时很有用,但在生产环境中可能会带来安全风险12。 -
证书链:某些网站可能有多个证书(证书链),代码中只获取了第一个证书(服务器证书),如果需要检查整个证书链,可以遍历
conn.getServerCertificates()
数组12。 -
性能考虑:如果需要频繁检查大量域名的证书状态,建议使用连接池并考虑异步处理。
-
错误处理:实际应用中应该添加更完善的错误处理逻辑,比如超时设置、重试机制等。