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。 -
性能考虑:如果需要频繁检查大量域名的证书状态,建议使用连接池并考虑异步处理。
-
错误处理:实际应用中应该添加更完善的错误处理逻辑,比如超时设置、重试机制等。