2012-12-21 26 views
14

के बीच अंतर कुंजीस्टोर और ट्रस्टस्टोर के लिए कीस्टोर ऑब्जेक्ट का उपयोग करने के बीच क्या अंतर है; KeyManager और TrustManager का उपयोग करने के विरोध में?KeyStore और KeyManager/TrustManager

मुझे बताएं कि मैं क्यों पूछ रहा हूं। मैं रीस्टेसी के साथ काम कर रहा हूं और एसएसएल प्रमाणपत्रों के साथ एचटीटीपीएस पर आरईएसटी कॉल करने की आवश्यकता है। मुझे यह बढ़ाने की ज़रूरत है कि रीस्टेसी ने क्लाइंटरूक्वेट कैसे बनाया। यहाँ है कि मैं क्या शुरू में पता लगा:

public void afterPropertiesSet() throws Exception { 
    Assert.isTrue(StringUtils.isNotBlank(getKeystoreName()), "Key Store Name is Blank"); 
    Assert.isTrue(StringUtils.isNotBlank(getKeystorePassword()), "Key Store Password is Blank."); 
    Assert.isTrue(StringUtils.isNotBlank(getKeystorePath()), "Key Store Path is Blank"); 
    Assert.isTrue(StringUtils.isNotBlank(getTruststoreName()), "Trust Store Name is Blank"); 
    Assert.isTrue(StringUtils.isNotBlank(getTruststorePassword()), "Trust Store Password is Blank."); 
    Assert.isTrue(StringUtils.isNotBlank(getTruststorePath()), "Trust Store Path is Blank"); 

    // Set the keystore and truststore for mutual authentication 
    createKeystore(); 
    createTruststore(); 

    if (getHttpClient() == null) { 
     // Initialize HTTP Client 
     initializeHttpClient(); 
    } 

    Assert.notNull(getHttpClient(), "HTTP Client is NULL after initialization"); 
} 

public ClientRequest createClientRequest(String uri) throws URISyntaxException { 
    ClientExecutor clientExecutor = new ApacheHttpClient4Executor(getHttpClient()); 
    ClientRequestFactory fac = new ClientRequestFactory(clientExecutor, new URI(uri)); 
    return fac.createRequest(uri); 
} 

private void createTruststore() throws KeyStoreException, FileNotFoundException, IOException, 
     NoSuchAlgorithmException, CertificateException { 

    String truststoreFilePath = getTruststorePath() + getTruststoreName(); 

    KeyStore truststore = KeyStore.getInstance(KeyStore.getDefaultType()); 
    InputStream truststoreInput = getClass().getClassLoader().getResourceAsStream(truststoreFilePath); 
    truststore.load(truststoreInput, getTruststorePassword().toCharArray()); 
} 

private void createKeystore() throws KeyStoreException, FileNotFoundException, IOException, 
     NoSuchAlgorithmException, CertificateException { 

    String keystoreFilePath = getKeystorePath() + getKeystoreName(); 
    KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
    InputStream keystoreInput = getClass().getClassLoader().getResourceAsStream(keystoreFilePath); 
    keystore.load(keystoreInput, getKeystorePassword().toCharArray()); 
} 

/** 
* Initializes the HTTP Client 
* 
* @throws KeyStoreException 
* @throws NoSuchAlgorithmException 
* @throws UnrecoverableKeyException 
* @throws KeyManagementException 
*/ 
private void initializeHttpClient() throws KeyManagementException, UnrecoverableKeyException, 
     NoSuchAlgorithmException, KeyStoreException { 

    // Register https and http with scheme registry 
    SchemeRegistry schemeRegistry = new SchemeRegistry(); 
    SSLSocketFactory sslSocketFactory = new SSLSocketFactory(getKeystore(), getKeystorePassword(), getTrustStore()); 
    schemeRegistry.register(new Scheme(HTTP, 80, PlainSocketFactory.getSocketFactory())); 
    schemeRegistry.register(new Scheme(HTTPS, 443, sslSocketFactory)); 

    // Set connection params 
    HttpConnectionParams.setConnectionTimeout(httpParameters, serviceConnectionTimeout); 
    HttpConnectionParams.setSoTimeout(httpParameters, readTimeout); 
    HttpConnectionParams.setStaleCheckingEnabled(httpParameters, true); 

    // Create Connection Manager 
    PoolingClientConnectionManager clientManager = new PoolingClientConnectionManager(schemeRegistry); 
    clientManager.setMaxTotal(maxTotalConnections); 
    clientManager.setDefaultMaxPerRoute(defaultMaxConnectionsPerHost); 

    httpClient = new DefaultHttpClient(clientManager, httpParameters); 
} 

मैं सहकर्मी प्रमाण पत्र के साथ एक समस्या में पड़ गए और एक अपवाद हो रही है:

javax.net.ssl.SSLPeerUnverifiedException: प्रमाणीकृत नहीं सहकर्मी

मैंने फिर खोज की और एचटीपी क्लाइंट स्थापित करने के बारे में लेख/ब्लॉग पाया लेकिन ट्रस्टमैनेजर और कीमैनगर का उपयोग कर। मैंने निम्न कार्य करने के लिए कोड को दोबारा प्रतिक्रिया दी:

public void afterPropertiesSet() throws Exception { 
    Assert.isTrue(StringUtils.isNotBlank(getKeystoreName()), "Key Store Name is Blank"); 
    Assert.isTrue(StringUtils.isNotBlank(getKeystorePassword()), "Key Store Password is Blank."); 
    Assert.isTrue(StringUtils.isNotBlank(getKeystorePath()), "Key Store Path is Blank"); 
    Assert.isTrue(StringUtils.isNotBlank(getTruststoreName()), "Trust Store Name is Blank"); 
    Assert.isTrue(StringUtils.isNotBlank(getTruststorePassword()), "Trust Store Password is Blank."); 
    Assert.isTrue(StringUtils.isNotBlank(getTruststorePath()), "Trust Store Path is Blank"); 

    if (getHttpClient() == null) { 
     // Initialize HTTP Client 
     initializeHttpClient(); 
    } 

    Assert.notNull(getHttpClient(), "HTTP Client is NULL after initialization"); 
} 

public ClientRequest createClientRequest(String uri) throws URISyntaxException { 
    ClientExecutor clientExecutor = new ApacheHttpClient4Executor(getHttpClient()); 
    ClientRequestFactory fac = new ClientRequestFactory(clientExecutor, new URI(uri)); 
    return fac.createRequest(uri); 
} 

/** 
* Initializes the HTTP Client 
* 
* @throws KeyStoreException 
* @throws NoSuchAlgorithmException 
* @throws UnrecoverableKeyException 
* @throws KeyManagementException 
*/ 
private void initializeHttpClient() throws Exception { 

    if (isCheckPeerCertificates()) { 
     checkPeerCerts(); 
    } 

    // Create Trust and Key Managers 
    // Use TrustManager and KeyManager instead of KeyStore 
    TrustManager[] trustManagers = getTrustManagers(getTruststorePassword()); 
    KeyManager[] keyManagers = getKeyManagers(getKeystorePassword()); 

    // Create SSL Context 
    SSLContext ctx = SSLContext.getInstance("TLS"); 
    ctx.init(keyManagers, trustManagers, new SecureRandom()); 

    // Create SSL Factory 
    SSLSocketFactory sslSocketFactory = new SSLSocketFactory(ctx, SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); 

    // Register https and http with scheme registry 
    SchemeRegistry schemeRegistry = new SchemeRegistry(); 
    schemeRegistry.register(new Scheme(HTTP, 80, PlainSocketFactory.getSocketFactory())); 
    schemeRegistry.register(new Scheme(HTTPS, 443, sslSocketFactory)); 

    // Set connection params 
    HttpConnectionParams.setConnectionTimeout(httpParameters, serviceConnectionTimeout); 
    HttpConnectionParams.setSoTimeout(httpParameters, readTimeout); 
    HttpConnectionParams.setStaleCheckingEnabled(httpParameters, true); 

    // Create Connection Manager 
    PoolingClientConnectionManager clientManager = new PoolingClientConnectionManager(schemeRegistry); 
    clientManager.setMaxTotal(maxTotalConnections); 
    clientManager.setDefaultMaxPerRoute(defaultMaxConnectionsPerHost); 

    httpClient = new DefaultHttpClient(clientManager, httpParameters); 
} 

private TrustManager[] getTrustManagers(String trustStorePassword) throws Exception { 
    String truststoreFilePath = getTruststorePath() + getTruststoreName(); 
    InputStream trustStoreInput = getClass().getClassLoader().getResourceAsStream(truststoreFilePath); 
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
    trustStore.load(trustStoreInput, trustStorePassword.toCharArray()); 
    TrustManagerFactory tmfactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    tmfactory.init(trustStore); 
    return tmfactory.getTrustManagers(); 
} 

private KeyManager[] getKeyManagers(String keyStorePassword) throws Exception { 
    String keystoreFilePath = getKeystorePath() + getKeystoreName(); 
    InputStream keyStoreInput = getClass().getClassLoader().getResourceAsStream(keystoreFilePath); 
    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 
    keyStore.load(keyStoreInput, keyStorePassword.toCharArray()); 
    KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    kmfactory.init(keyStore, keyStorePassword.toCharArray()); 
    return kmfactory.getKeyManagers(); 
} 

दूसरा कोड ठीक काम करता है। तो, 2 प्रकार के उपयोग के बीच क्या अंतर है?

उत्तर

13

मुझे लगता है कि यह आपकी मदद कर सकते हैं: Difference between trustStore and keyStore in Java - SSL

पहला और trustStore और कीस्टोर के बीच प्रमुख अंतर यह है कि trustStore TrustManager द्वारा किया जाता है और कीस्टोर जावा में KeyManager वर्ग द्वारा किया जाता है। KeyManager और TrustManager जावा में अलग-अलग काम करता है, ट्रस्टमैनेजर यह निर्धारित करता है कि रिमोट कनेक्शन पर भरोसा किया जाना चाहिए या नहीं, यानी रिमोट पार्टी का दावा है या नहीं और KeyManager निर्णय लेता है कि एसएसएल हैंडशेक के दौरान प्रमाणीकरण के लिए रिमोट होस्ट को कौन सा प्रमाणीकरण प्रमाण पत्र भेजा जाना चाहिए। यदि आप एक एसएसएल सर्वर हैं तो आप कुंजी एक्सचेंज एल्गोरिदम के दौरान निजी कुंजी का उपयोग करेंगे और क्लाइंट को अपनी सार्वजनिक कुंजी से संबंधित प्रमाण पत्र भेजेंगे, यह प्रमाणपत्र कुंजीस्टोर से अधिग्रहित किया गया है। एसएसएल क्लाइंट पक्ष पर, यदि जावा में लिखा गया है, तो यह सर्वर की पहचान सत्यापित करने के लिए ट्रस्टस्टोर में संग्रहीत प्रमाणपत्रों का उपयोग करेगा।

और अधिक पढ़ें: http://javarevisited.blogspot.com/2012/09/difference-between-truststore-vs-keyStore-Java-SSL.html#ixzz2kelYSEDj