原址(http://blog.sina.com.cn/s/blog_4bea2fb101000a65.html);
import java.io.FileInputStream;
import java.security.cert.CertificateExpiredException;
import java.security.cert.CertificateFactory;
import java.security.cert.CertificateNotYetValidException;
import java.security.cert.X509Certificate;
import java.util.Calendar;
import java.util.Date;
public class CheckCertValid {
public static void main(String args[]) throws Exception {
// 获取X509Certificate的对象
// 从命令行中读入需要验证的证书文件
CertificateFactory of = CertificateFactory.getInstance("x.509");
FileInputStream in = new FileInputStream("D:/tomcat.cer");
java.security.cert.Certificate ceof = of.generateCertificate(in);
System.out.println(ceof.getPublicKey().getEncoded() + "\t"
+ ceof.getEncoded());
in.close();
X509Certificate t = (X509Certificate) ceof;
// 获取日期
// 验证证书在某个日期是否有效,从命令行读入年月日,由此生成Date()对象。有Date类的很多设置年月日的方法已经不提倡使用,因此改用Calendar类,Calendar类也是一个工厂类,通过getInstance()方法获得对象,然后使用set()方法设置时间,最后通过其getTime()方法获得Date()对象由于Calendar类的set()方法参数是整数,因此对命令行参数读入的年月日字符串使用Integer.parseInt()方法转换为整数。由于Calendar类的set()方法设置月份时从0开始,0代表1月,11代表12月,因此命令读入的月份要减去1
Calendar cld = Calendar.getInstance();
int year = Integer.parseInt("2012");
int month = Integer.parseInt("9");
int day = Integer.parseInt("24");
cld.set(year, month, day);
Date d = cld.getTime();
System.out.println(d);
try {
// 检验证书
t.checkValidity(d);
System.out.print("OK");
}
// 处理CertificateExpiredException异常
// 若证书在指定日期已经过期,则产生CertificateExpiredException异常,在cath语句中作相关处理
catch (CertificateExpiredException e) {
System.out.println("expired");
System.out.println(e.getMessage());
}
// 处理CertificateNorYetValidException异常
// 若证书在指定日期尚未生效,则产生CertificateNorYetValidException异常,在cath语句中作相关处理
catch (CertificateNotYetValidException e) {
System.out.println("Too early");
System.out.println(e.getMessage());
}
}
}