2012-10-19 18 views
19
में प्रोग्राम के रूप में SSL प्रमाणपत्र समाप्ति की तारीख की जाँच करने के लिए कैसे

मैं जावा में वेब साइट पर SSL प्रमाणपत्र से समाप्ति तिथि को निकालने के लिए की जरूरत है, का समर्थन करना चाहिए दोनों पर विश्वास किया और इस तरह के रूप स्व-हस्ताक्षरित प्रमाणपत्र,: 1.trusted https://github.com 2 .self-हस्ताक्षरित https://mms.nw.ru/जावा

मैं पहले से ही कुछ कोड को कॉपी के रूप में:

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 के साथ जिथब प्रमाण पत्र, मुझे कैसे पता चलेगा कि किस प्रमाणपत्र से समाप्ति तिथि प्राप्त होनी चाहिए?

+0

गूगल यहां निर्देशित कर रहा है, भले ही मैं नेट के लिए पूछ रहा हूँ, तो मैं बस [इस लिंक] (http://forums.asp.net/post/4630222.aspx) एक सी # में जोड़ देंगे जवाब। –

उत्तर

17

कैसे एक X509Certificate को प्रमाण पत्र

यह कास्ट से समाप्ति तिथि को पार्स और getNotAfter() कॉल करने के लिए।

कैसे प्रमाणपत्र श्रृंखला, जैसे, चेन

आप इसे मिल गया है के साथ GitHub प्रमाण पत्र निर्धारित करने के लिए। Certificate[] सरणी है, जैसा कि यह Javadoc में कहता है।

मुझे कैसे पता चलेगा कि किस प्रमाणपत्र से समाप्ति तिथि प्राप्त की जाए?

Javadoc पढ़ें। "सहकर्मी का अपना प्रमाण पत्र पहले किसी प्रमाण पत्र प्राधिकरण के बाद होता है"।

हालांकि मुझे नहीं पता कि आप इनमें से कोई भी क्यों कर रहे हैं। जावा को आपके लिए यह सब कुछ करना चाहिए।

और कृपया उस असुरक्षित और गलत ट्रस्टमैनेजर कार्यान्वयन को फेंक दें। स्व-हस्ताक्षरित प्रमाणपत्रों को संभालने का सही तरीका क्लाइंट ट्रस्टस्टोर में उन्हें आयात करना है। कृपया अपने असुरक्षित HostnameVerifier को भी फेंक दें, और डिफ़ॉल्ट एक या एक सुरक्षित का उपयोग करें। यदि आप सुरक्षित नहीं होना चाहते हैं तो HTTPS का उपयोग क्यों करें?

+1

मेरा एप्लिकेशन एक निगरानी उपकरण है जिसमें एसएसएल की समाप्ति तिथि की निगरानी करने के लिए एक फ़ंक्शन है ताकि ग्राहक को जल्द ही समाप्त होने पर अधिसूचित किया जा सके। इसलिए मुझे परवाह नहीं है कि एचटीटीपीएस सफल है या नहीं, मुझे इसकी परवाह है कि यह कब समाप्त हो जाएगा। "जावा आपके लिए पहले से ही यह सब कर सकता है" से आपका क्या मतलब है? –

+0

@ ग्रेस मेरा मतलब था कि अगर प्रमाणपत्र समाप्त हो गया है तो यह 'एसएसएल हैंडशेक अपवाद' फेंक देगा।यह विश्वास करना मुश्किल है कि एक साधारण कैलेंडर प्रविष्टि किसी भी जावा कोड को लिखने के बिना उद्देश्य को पूरा नहीं करेगी। – EJP

+0

आपकी त्वरित प्रतिक्रिया के लिए धन्यवाद। सर्टिफिकेट से X509 प्रमाण पत्र में डालना मेरे लिए ठीक है। वैसे भी हमारे कार्यक्रमों का लक्ष्य स्वचालित रूप से एक प्रमाणपत्र की समाप्ति तिथि की निगरानी करना है और अगर यह जल्द ही समाप्त हो जाएगा तो व्यवस्थापक को सूचित किया जाएगा। हमारा आवेदन एक निगरानी प्रणाली है जैसे कि नागोस इत्यादि। यह है। आपने बहुत मदद की :) –

0

सुनिश्चित करें कि आप पीईएम प्रारूप में आरंभ/समाप्ति रेखाएं जोड़ दें अन्यथा जावा इसे समझ में नहीं आता है।

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(); 
     } 

    } 
}