52

ssl java接続をテストするために自己署名証明書を設定しましたが、javatrustStoreを見つけることを拒否しています。クラスがコンパイルされるフォルダ(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秒)

4

5 に答える 5

78

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

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

-Djavax.net.ssl.keyStore=path/to/keystore.jks
于 2010-01-26T10:06:37.800 に答える
46

タイプミスがあるようです。「trustStrore」は「trustStore」である必要があります。

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

する必要があります:

System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");
于 2010-01-26T18:12:41.193 に答える
13

両方

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

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

同じことをし、賢明に働くことに違いはありません。あなたの場合、タイプミスがあります。スペルを間違えtrustStoreましたjavax.net.ssl.trustStore.

于 2013-09-12T14:28:51.160 に答える
2

または、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();
    }
于 2019-06-18T10:41:47.833 に答える
0

他の人が指摘しているように、プロパティにタイプミスがあります。

JVMが構成済みのtrustStoreを使用しているかどうかを確認する別の方法は、プロパティを追加すること-Djavax.net.debug=allです。これにより、デバッグメッセージがオンになります。

アプリが起動すると、次のようなメッセージが出力されます。

javax.net.ssl|DEBUG|11|parallel-1|2021-04-17 21:25:13.827 CST|TrustStoreManager.java:112|trustStore is: C:/path/to/the/trustStore

次に、必要なものを使用しているか、デフォルトのJDKが付属しているかを判断できます。

参照
于 2021-04-17T13:34:37.513 に答える