2012-03-01 64 views
18

我的java應用程序使用密鑰庫文件,其中有一個證書,該證書在與活動目錄服務器的ssl連接中使用。 我所要做的就是檢查它的到期日期並提示用戶是否過期。我必須在我的應用程序啓動時執行此操作。我的想法是使用外部程序:keytool在密鑰庫中顯示有關特定證書的信息,然後對keytool輸出的字符串執行一些解析操作以找到此驗證日期。檢查java密鑰庫中的證書到期日期

這裏有一個具體的keytool命令的輸出:

Owner: 
Issuer: CN=CPD Root CA, DC=cpd, DC=local<br> 
Serial number: 39e8d1610002000000cb 
<br>Valid from: Wed Feb 22 21:36:31 CET 2012 until: Thu Feb 21 21:36:31 CET 2013 
Certificate fingerprints: <br> 
     MD5: 82:46:8B:DB:BC:5C:64:21:84:BB:68:E3:4B:D4:35:70<br> 
     SHA1: 35:52:CA:F2:11:66:1E:50:63:BC:53:A5:50:C1:F0:1E:62:81:BC:3F<br> 
     Signature algorithm name: SHA1withRSA 

問題將與解析日期,因爲我不能確定以哪種方式被顯示出來。

有沒有更簡單的方法來檢查包含在java keystore文件中的證書的過期日期?

回答

7

使用java.security.Keystore類加載密鑰庫並枚舉其內容,並檢查每個證書是否到期。

+0

謝謝,解決了這個問題。 – 2012-03-01 13:42:00

20

感謝EJP的方向,這裏是我想出的一塊。

try { 
     KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     keystore.load(new FileInputStream("keystoreLocation"), "keystorePassword".toCharArray()); 
     Enumeration<String> aliases = keystore.aliases(); 
     while(aliases.hasMoreElements()){ 
      String alias = aliases.nextElement(); 
      if(keystore.getCertificate(alias).getType().equals("X.509")){ 
       System.out.println(alias + " expires " + ((X509Certificate) keystore.getCertificate(alias)).getNotAfter()); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
+1

在上面的代碼中,如果條目不包含證書條目,keystore.getCertificate(別名)可能會返回null。它也只是返回證書鏈的第一個條目,理論上可能有一個證書授權機構進一步提前到期。 – 2013-08-02 08:01:05