Ответ 1
У вас есть опечатка - это trustStore
.
Помимо установки переменных с помощью System.setProperty(..)
, вы также можете использовать
-Djavax.net.ssl.keyStore=path/to/keystore.jks
Я установил самозаверяющий сертификат для проверки соединения ssl java, однако он отказывается найти хранилище java. Я сохранил их копии в /Java/jre6/lib/security в дополнение к папке, в которой скомпилированы классы (im, использующие netbeans), а также в /java/jre6/bin. Ни одно из перечисленных выше не работает, потому что когда я запускаю следующее: 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);
}
}
}
run: java.lang.NullPointerException classpath: 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 секунд)
У вас есть опечатка - это trustStore
.
Помимо установки переменных с помощью System.setProperty(..)
, вы также можете использовать
-Djavax.net.ssl.keyStore=path/to/keystore.jks
Похоже, у вас есть опечатка - "trustStrore" должен быть "trustStore", т.е.
System.setProperty("javax.net.ssl.trustStrore", "cacerts.jks");
должен быть:
System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");
И
-Djavax.net.ssl.trustStore=path/to/trustStore.jks
и
System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");
делать то же самое и не иметь никакой разницы в работе. В вашем случае у вас просто опечатка. У вас с ошибкой trustStore
в javax.net.ssl.trustStore.
В качестве альтернативы, если использование 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();
}