javax.net.ssl.SSLException: java.security.InvalidAlgorithmParameterException: параметр trustAnchors должен быть непустым - PullRequest
11 голосов
/ 05 декабря 2011

Я хочу проанализировать XML-файл, который ежедневно обновляет указанный файл - единственная проблема, с которой я столкнулся, заключается в том, что они используют свой собственный сертификат ( https: //...) И яне может использовать этот конкретный URL, и при этом нет ссылки http: // ....

URL url = new URL("https://...");
...
Document document = db.parse(url.openStream());

Этот код выдает следующее исключение при выполнении моих тестов:

javax.net.ssl.SSLException: java.lang.RuntimeException: непредвиденная ошибка: java.security.InvalidAlgorithmParameterException: параметр trustAnchors должен быть непустым

Я видел множество предложений, касающихсяс созданием различных классов для работы с этим типом соединения или с персональным сервером, а также с добавлением сертификата в хранилище ключей и последующим добавлением этого хранилища ключей в проект Java, но я не смог этого сделать и ищуМне немного проще получить доступ к XML онлайн.

Ответы [ 4 ]

10 голосов
/ 17 сентября 2013

Вам необходимо доверенное хранилище для хранения сертификатов SSL.Вы можете скачать сертификат, используя предпочитаемый вами веб-браузер.Чтобы загрузить сертификат в хранилище доверенных сертификатов, вам нужна программа «keytool», которая поставляется с JDK.

Например, если ваш файл сертификата называется «certificate.crt» и вы хотите создать хранилище доверенных сертификатов с именем«secure.ts», вы можете вызывать keytool следующим образом:

keytool -importcert -keystore secure.ts -storepass S3cuR3pas$! -file certificate.crt

Теперь вы должны сообщить своей программе, где находится хранилище ключей и пароль для его открытия, определяя системные свойства »javax.net.ssl.trustStore "и" javax.net.ssl.trustStorePassword " до открытия соединения

URL url = new URL("https://...");

System.setProperty("javax.net.ssl.trustStore", "secure.ts");
System.setProperty("javax.net.ssl.trustStorePassword", "S3cuR3pas$!");
...
Document document = db.parse(url.openStream());
3 голосов
/ 05 декабря 2011

Это любопытное сообщение означает, что хранилище доверенных сертификатов не найдено.

Ничего общего с XML BTW.

1 голос
/ 30 декабря 2015

Вы можете попробовать это:

String javaHomePath = System.getProperty("java.home");
String keystore = javaHomePath + "/lib/security/cacerts";
String storepass= "changeit";
String storetype= "JKS";

String[][] props = {
    { "javax.net.ssl.trustStore", keystore, },
    { "javax.net.ssl.keyStore", keystore, },
    { "javax.net.ssl.keyStorePassword", storepass, },
    { "javax.net.ssl.keyStoreType", storetype, },
};
for (int i = 0; i < props.length; i++) {
    System.getProperties().setProperty(props[i][0], props[i][1]);
}
// Now you can proceed to connect to call the webservice.
// SSL will be used automatically if the service endpoint url 
// starts with <a href="https://." target="_blank"         rel="nofollow">https://.</a>
// The server will send its certificate signed by verisign and 
// client will trust and authenticate the server as it recognizes 
// verisign as one trusted root.
0 голосов
/ 05 января 2015

Я столкнулся с тем же исключением для моего MAC OSX (Yosemite) при разработке приложений для Java 6. Вам необходимо загрузить и установить Apple Java для OSX 2014:

http://support.apple.com/kb/DL1572

...