2010-10-19 12 views
5

मैं एक रनिंग सेवा को पुनरारंभ किए बिना कीस्टोर में एक नया प्रमाणपत्र आयात करना चाहता हूं। क्या यह संभव है?क्या मैं जेवीएम को पुनरारंभ किए बिना कीस्टोर में नया प्रमाणपत्र जोड़ सकता हूं?

वैकल्पिक रूप से, क्या एक विशिष्ट यूआरएल कनेक्शन के लिए कीस्टोर में उपयोग करने के लिए प्रमाण पत्र निर्दिष्ट करना संभव है?

उत्तर

7

बाहर निकलता है आप विशिष्ट यूआरएल fetches के लिए उपयोग करने के लिए विशिष्ट प्रमाणपत्र निर्दिष्ट कर सकते हैं; अनिवार्य रूप से, आपको अपना खुद का ट्रस्टमैनेजर बनाना होगा और इसे स्वैप करना होगा, जैसे:

public String fetchFromUrl(String urlString) throws IOException { 
    URL url = new URL(urlString); 
    URLConnection conn = url.openConnection(); 

    if (conn instanceof HttpsURLConnection && shouldSubstituteCert(url)) { 
    HttpsURLConnection sslConn = (HttpsURLConnection) conn; 
    try { 
     SSLContext context = SSLContext.getInstance("SSL"); 
     context.init(null, new TrustManager[] {new MyTrustManager()}, null); 
     sslConn.setSSLSocketFactory(context.getSocketFactory()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
     throw new IOException("Error creating custom keystore", e); 
    } 
    } 

    return readAll(conn.getInputStream()); 
} 

private static class MyTrustManager implements X509TrustManager { 
    private final X509TrustManager trustManager; 
    public MyTrustManager() throws 
     KeyStoreException, NoSuchAlgorithmException, 
     CertificateException, IOException { 

    // Load a KeyStore with only our certificate 
    KeyStore store = KeyStore.getInstance(KeyStore.getDefaultType()); 
    store.load(null, null); 
    Certificate cert = loadPemCert(); 
    store.setCertificateEntry("me.com", cert); 

    // create a TrustManager using our KeyStore 
    TrustManagerFactory factory = TrustManagerFactory.getInstance(
     TrustManagerFactory.getDefaultAlgorithm()); 
    factory.init(store); 
    this.trustManager = getX509TrustManager(factory.getTrustManagers()); 
    } 

    public void checkClientTrusted(X509Certificate[] chain, String authType) 
     throws CertificateException { 
    trustManager.checkClientTrusted(chain, authType); 
    } 

    public void checkServerTrusted(X509Certificate[] chain, String authType) 
     throws CertificateException { 
    trustManager.checkServerTrusted(chain, authType); 
    } 

    public X509Certificate[] getAcceptedIssuers() { 
    return trustManager.getAcceptedIssuers(); 
    } 

    private static X509TrustManager getX509TrustManager(TrustManager[] managers) { 
    for (TrustManager tm : managers) { 
     if (tm instanceof X509TrustManager) { 
     return (X509TrustManager) tm; 
     } 
    } 
    return null; 
    } 

    private Certificate loadPemCert() 
     throws CertificateException, IOException { 
    InputStream stream = 
     this.getClass().getClassLoader().getResourceAsStream("cert.pem"); 

    CertificateFactory factory = CertificateFactory.getInstance("X.509"); 
    return factory.generateCertificate(stream); 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे