2012-12-21 5 views
14

キーストアとKeyStoreのKeyStoreオブジェクトの使用との違いは何ですか? KeyManagerとTrustManagerを使用するのではなく、KeyStoreとKeyManager/TrustManagerの相違点

なぜ私が尋ねているのか説明しましょう。私はRESTEasyを使用しており、SSL証明書を使用してHTTPS経由でREST呼び出しを行う必要がありました。私はRESTEasyがClientRequestをどのように作成したかを増やす必要がありました。ここで私が最初に考え出したものです:

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:

を認証されていないピア

次に、HttpClientの設定について、TrustManagerとKeyManagerを使用して記事やブログを検索しました。私はコードを次のようにリファクタリングしました:

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番目のコードはうまくいきます。では、2種類の用途の違いは何ですか?

答えて

13

私は、これはあなたを助けることができると思う: Difference between trustStore and keyStore in Java - SSL

ファーストとトラストストアとキーストアの主な違いは、trustStoreにはTrustManagerのキーストアで使用されていることですが、JavaでのKeyManagerクラスによって使用されています。 KeyManagerとTrustManagerがJavaで異なるジョブを実行する場合、TrustManagerはリモート接続を信頼するかどうか、つまりリモートパーティーが誰であるかをKeyManagerがSSLハンドシェイク中に認証するためにリモートホストに送信する必要があるかどうかを決定します。 SSLサーバーの場合、鍵交換アルゴリズム中に秘密鍵を使用し、公開鍵に対応する証明書をクライアントに送信します。この証明書はkeyStoreから取得されます。 SSLクライアント側では、Javaで書かれていると、trustStoreに格納されている証明書を使用してServerのIDを確認します。

続きを読む:http://javarevisited.blogspot.com/2012/09/difference-between-truststore-vs-keyStore-Java-SSL.html#ixzz2kelYSEDj

関連する問題