web-dev-qa-db-ja.com

java-trustStoreへのパス-プロパティの設定が機能しませんか?

SSL Java接続をテストするために自己署名証明書をセットアップしましたが、Java trustStoreを見つけることを拒否しています。クラスのコンパイル先フォルダー(netbeansを使用)および/ Java/jre6/binに加えて、そのコピーを/ Java/jre6/lib/securityに保存しました。また、上記のいずれも機能しないようです。私が次を実行すると-trustStore = null。

public class ShowTrustStore {

    public static void main(String[] args) {

        System.setProperty("javax.net.ssl.keyStore", "keystore.jks");
        System.setProperty("javax.net.ssl.trustStrore", "cacerts.jks");
        System.setProperty("javax.net.ssl.keyStorePassword", "changeit");



        String trustStore = System.getProperty("javax.net.ssl.trustStore");
        if (trustStore == null) {
            System.out.println("javax.net.ssl.trustStore is not defined");
        } else {
            System.out.println("javax.net.ssl.trustStore = " + trustStore);
        }
    }
}

パスを正しく設定する方法は?

********** UPDATE ************ getFile()メソッドとその他のデバッグデータの使用:

package ssltest;

public class Main {

    public static void main(String[] args) {

//        System.setProperty("javax.net.ssl.keyStore", "/keystore.jks");
//        System.setProperty("javax.net.ssl.trustStrore", "/Java.home/cacerts.jks");
//        System.setProperty("javax.net.ssl.keyStorePassword", "changeit");
//        System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

        try {
            Main.class.getResource("trustStore.jks").getFile();
        } catch (Exception e) {
            e.printStackTrace();
        }

        String trustStore = System.getProperty("javax.net.ssl.trustStore");

        if (trustStore == null) {
            String storeLoc;
            storeLoc = System.getProperty("Java.class.path");
            System.out.println("classpath: " + storeLoc);
        }

        trustStore = System.getProperty("javax.net.ssl.trustStore");
        if (trustStore == null) {
            System.out.println("javax.net.ssl.trustStore is not defined");
        } else {
            System.out.println("javax.net.ssl.trustStore = " + trustStore);
        }
    }
}

実行:Java.lang.NullPointerExceptionクラスパス:C:\ Users\Main\Documents\NetBeansProjects\sslTest\build\classes; C:\ Users\Main\Documents\NetBeansProjects\sslTest\src at ssltest.Main.main(Main.Java :15)javax.net.ssl.trustStoreは定義されていませんBUILD SUCCESSFUL(合計時間:0秒)

48
oneAday

タイプミスがあります-trustStoreです。

System.setProperty(..)を使用して変数を設定する以外に、次を使用することもできます。

-Djavax.net.ssl.keyStore=path/to/keystore.jks
64
Bozho

タイプミスがあるようです-「trustStrore」は「trustStore」、つまり.

System.setProperty("javax.net.ssl.trustStrore", "cacerts.jks");

する必要があります:

System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");
44
Don Isenor

両方

-Djavax.net.ssl.trustStore=path/to/trustStore.jks

そして

System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");

同じことを行い、賢明な作業に違いはありません。あなたの場合、タイプミスがあります。 javax.net.ssl.trustStore.trustStoreのつづりが間違っています

11
Aniket Thakur

あるいは、javax.net.ssl.trustStoreを使用してトラストストアの場所を指定しても機能しない場合(私の場合の双方向認証の場合のように)、以下の例に示すようにSSLContextBuilderを使用することもできます。この例には、SSLビルダーの動作を示すためにhttpclientを作成する方法も含まれています。

SSLContextBuilder sslcontextbuilder = SSLContexts.custom();

sslcontextbuilder.loadTrustMaterial(
            new File("C:\\path to\\truststore.jks"), //path to jks file
            "password".toCharArray(), //enters in the truststore password for use
            new TrustSelfSignedStrategy() //will trust own CA and all self-signed certs
            );

SSLContext sslcontext = sslcontextbuilder.build(); //load trust store

SSLConnectionSocketFactory sslsockfac = new SSLConnectionSocketFactory(sslcontext,new String[] { "TLSv1" },null,SSLConnectionSocketFactory.getDefaultHostnameVerifier());

CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsockfac).build(); //sets up a httpclient for use with ssl socket factory 



try { 
        HttpGet httpget = new HttpGet("https://localhost:8443"); //I had a Tomcat server running on localhost which required the client to have their trust cert

        System.out.println("Executing request " + httpget.getRequestLine());

        CloseableHttpResponse response = httpclient.execute(httpget);
        try {
            HttpEntity entity = response.getEntity();

            System.out.println("----------------------------------------");
            System.out.println(response.getStatusLine());

            EntityUtils.consume(entity);
        } finally {
            response.close();
        }
    } finally {
        httpclient.close();
    }
1
J Medeiros