2012-10-19 51 views
19

我需要在Java的Web站點SSL證書提取截止日期,應支持 信任和自簽名的證書,如: 1.trusted https://github.com 2 .self簽名 https://mms.nw.ru/如何檢查SSL證書的有效期限編程在Java中

我已經複製了一些代碼:

import java.net.URL; 
import java.security.SecureRandom; 
import java.security.cert.Certificate; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 
import javax.net.ssl.HostnameVerifier; 
import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.KeyManager; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSession; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 

public class SSLTest { 

    public static void main(String [] args) throws Exception { 
     // configure the SSLContext with a TrustManager 
     SSLContext ctx = SSLContext.getInstance("TLS"); 
     ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom()); 
     SSLContext.setDefault(ctx); 

     URL url = new URL("https://github.com");//https://mms.nw.ru 
     HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
     conn.setHostnameVerifier(new HostnameVerifier() { 
      @Override 
      public boolean verify(String arg0, SSLSession arg1) { 
       return true; 
      } 
     }); 
     System.out.println(conn.getResponseCode()); 
     Certificate[] certs = conn.getServerCertificates(); 
     for (Certificate cert :certs){ 
      System.out.println(cert.getType()); 
      System.out.println(cert); 
     } 

     conn.disconnect(); 
    } 

    private static class DefaultTrustManager implements X509TrustManager { 

     @Override 
     public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} 

     @Override 
     public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} 

     @Override 
     public X509Certificate[] getAcceptedIssuers() { 
      return null; 
     } 
    } 
} 

的問題是:

  1. 如何從證書解析截止日期,在我的代碼中的ToString()做輸出的日期,但很難進行解析。

  2. 如何確定證書鏈,例如,用鐵鏈3 GitHub的證書,我怎麼知道,從獲得的到期日期哪些證書?

+0

谷歌正在指揮這裏即使我所要求的.NET,所以我就加入[此鏈接](http://forums.asp.net/post/4630222.aspx)到C#回答。 –

回答

17

如何從證書

演員解析它的有效期到X509Certificate並調用getNotAfter()

如何確定證書鏈,例如,用鐵鏈

你明白了GitHub的證書。這就是Certificate[]陣列,就像它在Javadoc中所說的那樣。

我怎麼會知道,從獲得的到期日期哪些證書?

閱讀Javadoc。 「首先由同行自己的證書,然後是任何證書頒發機構」。

但是我不知道你爲什麼要這樣做。 Java應該已經爲你做了這一切。

請丟棄那個不安全和不正確的TrustManager實現。處理自簽名證書的正確方法是將它們導入到客戶端信任庫中。請同時丟棄不安全的HostnameVerifier,並使用默認的或安全的。爲什麼要使用HTTPS,如果你不希望它是安全的?

+1

我的應用程序是一個監視工具,它具有監視SSL過期日期的功能,以便客戶可以在即將到期時得到通知。所以我不在乎HTTPS是否安全,我只在乎它何時會過期。 「Java應該已經爲你做了這些」,你是什麼意思? –

+0

@Grace我的意思是說,如果證書已經過期,它會拋出一個'SSLHandshakeException'。很難相信如果不編寫任何Java代碼,簡單的日曆條目就無法達到目的。 – EJP

+0

感謝您的快速響應。我可以從Certificate到X509Certificate。無論如何,我們的程序旨在自動監控一個證書的到期日期,並將通知管理員,如果它將很快到期。我們的應用程序是一個監控系統就像nagios等。就是這樣。你非常幫助:) –

0

請務必附上開始/結束行PEM格式,否則Java不明白。

public class CertTest { 

    public static final String cert = "-----BEGIN CERTIFICATE-----\n<CERT_DATA>\n-----END CERTIFICATE-----"; 

    public static void main(String[] args){ 
     try { 
      X509Certificate myCert = (X509Certificate)CertificateFactory 
        .getInstance("X509") 
        .generateCertificate(
             // string encoded with default charset 
        new ByteArrayInputStream(cert.getBytes()) 
        ); 
      System.out.println(myCert.getNotAfter()); 

     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
}