java - trustStore 的路径 - 设置属性不起作用?

Posted

技术标签:

【中文标题】java - trustStore 的路径 - 设置属性不起作用?【英文标题】:java - path to trustStore - set property doesn't work? 【发布时间】:2011-01-09 11:05:35 【问题描述】:

我已经设置了一个自签名证书来测试 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);
        
    

如何正确设置路径?

**********更新************ 使用 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 在 ssltest.Main.main(Main.java:15) javax.net.ssl.trustStore 未定义 构建成功(总时间:0 秒)

【问题讨论】:

很高兴知道我不是唯一一个一个小时一个小时地搜索错误的人......因为一个小错字......;-) 【参考方案1】:

你有一个错字 - 它是trustStore

除了用System.setProperty(..)设置变量外,还可以使用

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

【讨论】:

我不确定我还能尝试什么 - 即使我存储了这两个文件,我现在也将 java.home 值设为 C:\Program Files (x86)\Java\jdk1.6.0_17\jre在这里运行: System.setProperty("javax.net.ssl.keyStore", "/java.home/keystore.jks"); System.setProperty("javax.net.ssl.trustStrore", "/java.home/cacerts.jks");它仍然没有找到它们...... java.home 未解析为路径。您可以通过 System.getProperty("java.home") 获取它,但不建议将密钥库放在那里。此外,我给了你三个选择 - 试试看。 我都试过了——第一个不起作用,第二个方法抛出空指针异常——我添加了上面的代码和调试信息。我将文件存储在这两个位置(显示为类路径):C:\Users\Main\Documents\NetBeansProjects\sslTest\build\classes;C:\Users\Main\Documents\NetBeansProjects\sslTest\src any想法出了什么问题?谢谢!! @oneAday - 我注意到您的评论说您设置了一个名为“javax.net.ssl.trustStrore”的属性。关闭......但没有雪茄。 @Bozho 问题不是在命令行上而不是在运行时设置——它只是一个错字。您不必在命令行上设置它——无论哪种方式都可以正常工作。【参考方案2】:

看起来你有一个错字——“trustStrore”应该是“trustStore”,即

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

应该是:

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

【讨论】:

通过使用 -Djavax.net.ssl.trustStore=/home/path/to/truststore 和 Tomcat8 对我有用【参考方案3】:

两者

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

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

做同样的事情,在工作上没有区别。在你的情况下,你只是有一个错字。你在javax.net.ssl.trustStore.中拼错了trustStore

【讨论】:

不正确,具有误导性。 trustStore 是受信任服务器的公钥的客户端容器,而 keyStore 是您的私钥的容器。 @peterh 不正确,具有误导性。信任库是客户端或服务器端的容器,用于存放可信签名者的证书【参考方案4】:

或者,如果使用 javax.net.ssl.trustStore 来指定信任库的位置不起作用(就像在我的情况下使用双向身份验证一样),您也可以使用 SSLContextBuilder,如下例所示。此示例还包括如何创建 httpclient 以及展示 SSL 构建器的工作方式。

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();
    

【讨论】:

这是唯一在我无法直接访问的远程服务器建立的连接上为我工作的东西。我最终将 SSLSocketConnectionFactory 注入到 Spring Rest 模板中,它就像一个魅力。谢谢! 如果你提供进口会更好【参考方案5】:

正如其他人指出的那样,该属性存在拼写错误。

另一种检查 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自带的默认的。

参考 https://docs.oracle.com/javase/7/docs/technotes/guides/security/jsse/ReadDebug.html

【讨论】:

以上是关于java - trustStore 的路径 - 设置属性不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

markdown 使用OpenSSL下载PEM证书并导入Java TrustStore

在 Java (JSSE) 中使用默认 KeyStore 时如何提供特定的 TrustStore

Elasticsearch:在 Java 客户端中使用 truststore 来创建 HTTPS 连接

SSL请求trustStore的两种注册方式

数字证书:如何使用将 .cer 文件导入 .truststore 文件?

JAVA修改AD域密码_免证书认证